JavaScript入门⑩|BOM与浏览器对象,localStorage_位置_历史记录


author: 专注前端开发,分享JavaScript干货

title: JavaScript入门⑩|BOM与浏览器对象,localStorage_位置_历史记录
update: 2026-04-28
tags: JavaScript,BOM,localStorage,sessionStorage,location,navigator,history,前端入门

作者:专注前端开发,分享JavaScript干货

更新时间:2026年4月

适合人群:掌握DOM操作,想了解浏览器对象模型的开发者


前言:BOM是什么?

DOM操作网页内容,BOM(Browser Object Model)操作浏览器本身。

BOM包含:window、navigator、location、history、screen、localStorage等。


一、window 对象

window 是浏览器窗口的全局对象,所有全局变量和函数都是它的属性/方法。

javascript 复制代码
// 全局变量实际上是window的属性
var name = "张三";
console.log(window.name); // "张三"

// 常用window方法
window.alert("提示");           // 弹窗
window.confirm("确定删除?");    // 确认框,返回true/false
window.prompt("请输入:");       // 输入框

// 窗口尺寸
console.log(window.innerWidth);  // 可视区宽度(不含工具栏)
console.log(window.innerHeight); // 可视区高度
console.log(window.outerWidth);  // 整个浏览器宽度
console.log(window.outerHeight); // 整个浏览器高度

// 窗口操作
window.open("https://example.com"); // 打开新窗口
window.close();                      // 关闭窗口

// 定时器
const timeoutId = setTimeout(() => console.log("1秒后"), 1000);
const intervalId = setInterval(() => console.log("每秒"), 1000);

// 清除定时器
clearTimeout(timeoutId);
clearInterval(intervalId);

二、navigator 对象(浏览器信息)

javascript 复制代码
// 用户代理字符串(浏览器识别)
console.log(navigator.userAgent);
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...

// 浏览器名称和版本
console.log(navigator.appName);  // "Netscape"
console.log(navigator.appVersion);
console.log(navigator.appCodeName);

// 操作系统
console.log(navigator.platform); // "Win32"

// 语言
console.log(navigator.language);  // "zh-CN"
console.log(navigator.languages); // ["zh-CN", "zh", "en"]

// 是否联网
console.log(navigator.onLine);

// 是否启用了Cookie
console.log(navigator.cookieEnabled);

// 检测移动端
const isMobile = /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
console.log("是否移动端:", isMobile);

// 剪贴板访问(需要用户授权)
async function copyToClipboard(text) {
    try {
        await navigator.clipboard.writeText(text);
        console.log("复制成功!");
    } catch (error) {
        console.error("复制失败:", error);
    }
}

三、location 对象(URL信息)

javascript 复制代码
// URL解析
console.log(location.href);      // 完整URL
console.log(location.protocol); // "https:"
console.log(location.host);      // "www.example.com"
console.log(location.hostname); // "www.example.com"
console.log(location.port);      // "8080"
console.log(location.pathname);  // "/path/to/page"
console.log(location.search);    // "?id=123&name=test"
console.log(location.hash);       // "#section"

// 解析URL参数
const params = new URLSearchParams(location.search);
console.log(params.get("id"));    // "123"
console.log(params.get("name"));  // "test"

// 修改URL(不刷新页面)
history.pushState(null, "", "/new-page"); // 添加历史记录
history.replaceState(null, "", "/another"); // 替换当前记录

// 页面跳转
location.href = "https://example.com";  // 跳转(产生历史记录)
location.assign("https://example.com");  // 同上
location.replace("https://example.com"); // 替换(不产生历史记录)
location.reload();                        // 刷新页面
location.reload(true);                    // 强制从服务器刷新(Ctrl+F5)

四、history 对象(浏览历史)

javascript 复制代码
// 历史记录数量
console.log(history.length);

// 前进后退
history.back();     // 后退一页(等同浏览器后退按钮)
history.forward();  // 前进一页
history.go(-2);     // 后退两页
history.go(1);      // 前进一页

// pushState / replaceState(不刷新页面的路由)
history.pushState({ page: 1 }, "", "/page1");
history.pushState({ page: 2 }, "", "/page2");
history.pushState({ page: 3 }, "", "/page3");

// 监听浏览器前进后退(popstate事件)
window.addEventListener("popstate", (event) => {
    console.log("当前state:", event.state);
    // 根据state更新页面内容
});

五、localStorage 与 sessionStorage

5.1 localStorage(持久存储)

javascript 复制代码
// 存储数据(键值对,值必须是字符串)
localStorage.setItem("username", "张三");
localStorage.setItem("age", "25"); // 数字会自动转字符串

// 读取数据
const name = localStorage.getItem("username");
console.log(name); // "张三"

// 删除数据
localStorage.removeItem("username"); // 删除单个
localStorage.clear(); // 清空全部

// 存储对象(需要序列化)
const user = { name: "张三", age: 25 };
localStorage.setItem("user", JSON.stringify(user));
const stored = JSON.parse(localStorage.getItem("user"));
console.log(stored.name); // "张三"

// 存储数组
const fruits = ["苹果", "香蕉", "橙子"];
localStorage.setItem("fruits", JSON.stringify(fruits));
console.log(JSON.parse(localStorage.getItem("fruits"))); // ["苹果", "香蕉", "橙子"]

5.2 sessionStorage(会话存储)

javascript 复制代码
// 与localStorage用法完全相同
sessionStorage.setItem("temp", "临时数据");

// 区别:sessionStorage在浏览器关闭后自动清除
// localStorage 永久保存(除非手动清除)
console.log(sessionStorage.getItem("temp"));

5.3 存储事件监听(跨标签页通信)

javascript 复制代码
// 当localStorage在别的标签页被修改时触发
window.addEventListener("storage", (event) => {
    console.log("修改的键:", event.key);
    console.log("旧值:", event.oldValue);
    console.log("新值:", event.newValue);
    console.log("来源:", event.url);
});

六、实战:用户偏好设置存储

javascript 复制代码
class SettingsStore {
    constructor(prefix = "app_") {
        this.prefix = prefix;
    }

    set(key, value) {
        const fullKey = this.prefix + key;
        const data = typeof value === "object"
            ? JSON.stringify(value)
            : String(value);
        localStorage.setItem(fullKey, data);
    }

    get(key, defaultValue = null) {
        const fullKey = this.prefix + key;
        const data = localStorage.getItem(fullKey);
        if (data === null) return defaultValue;

        try {
            return JSON.parse(data);
        } catch {
            return data;
        }
    }

    remove(key) {
        localStorage.removeItem(this.prefix + key);
    }

    clear() {
        const keys = Object.keys(localStorage);
        keys.forEach(key => {
            if (key.startsWith(this.prefix)) {
                localStorage.removeItem(key);
            }
        });
    }
}

// 使用
const store = new SettingsStore("user_");

// 保存用户设置
store.set("theme", "dark");
store.set("fontSize", 16);
store.set("userInfo", { name: "张三", email: "zhang@example.com" });

// 读取
console.log(store.get("theme"));      // "dark"
console.log(store.get("fontSize"));  // "16"
console.log(store.get("userInfo"));   // { name: "张三", email: "zhang@example.com" }
console.log(store.get("notExist", "默认值")); // "默认值"

七、知识卡

对象 作用
window 浏览器窗口,全局对象
navigator 浏览器信息、在线状态
location URL信息、页面跳转
history 浏览历史、路由
localStorage 持久存储(不主动清除一直存在)
sessionStorage 会话存储(关闭浏览器后清除)
setTimeout 一次性定时器
setInterval 重复定时器

八、课后作业

  1. localStorage 实现一个页面访问计数器,刷新页面后显示访问次数
  2. sessionStorage 实现一个表单草稿保存功能(输入内容后刷新页面不丢失)
  3. navigator.onLine 监听网络状态变化,断网时显示提示

有问题欢迎评论区留言,大家一起讨论!


标签:JavaScript | BOM | localStorage | sessionStorage | location | navigator | history | 前端入门

相关推荐
cookies_s_s2 分钟前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
YHL8 分钟前
🤖 Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·javascript·人工智能
盐焗鹌鹑蛋1 小时前
【C++】继承
开发语言·c++
HUMHSX2 小时前
Vue 组件通信核心知识点梳理
javascript·vue.js·ecmascript
栈溢出了2 小时前
Java Lambda 表达式笔记
java·开发语言·intellij-idea
zhixingheyi_tian2 小时前
一份GC日志的解读
java·开发语言
czhaii2 小时前
串口1中断收发-C语言-MODBUS协议
c语言·开发语言
风止何安啊2 小时前
🚦 前端并发请求 “交通管制”:别让你的接口堵成早高峰
前端·javascript·面试
熊猫钓鱼>_>2 小时前
2026 前端的三场底层革命:当 Vue、React Native 和 Three.js 同时去掉中间层
前端·javascript·vue.js·react native·架构·webgl·three.js
名字还没想好☜2 小时前
React useEffect 依赖数组踩坑:闭包陷阱与清理函数
前端·javascript·react.js·react·useeffect