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 | 前端入门

相关推荐
必须会一定会2 小时前
Agent Plugins 1.0实战:plugin.json、skills、mcp.json目录结构与迁移
开发语言·人工智能·ai编程
St_rive3 小时前
Page Object设计模式
java·开发语言·设计模式
wp123_13 小时前
硬件元器件笔记|IPX8 防水 Type‑C 母座安费诺 124018802112A 与 TONEVEE TY48086‑24A 分析
c语言·开发语言·笔记
wuyk5553 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机
luj_17684 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
vipbic4 小时前
一个前端的 9 天重构:我是怎么用 Codex 重做航栈的
前端·javascript·后端
caimouse5 小时前
ReactOS 图形系统分析(16):字符串对象 — STROBJ(string.c)
c语言·开发语言
Aphelios3806 小时前
一次锁内网络IO引发的Tomcat线程池“饿死”事故
java·开发语言·spring boot·elasticsearch·tomcat·网络io阻塞·线程池耗尽
不可求~6 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++