BOM 不是标准定义的类或构造函数,而是对浏览器提供的一组非标准化全局对象的统称;其核心是 window 对象,navigator、location 等均为其属性;location 可读写并触发跳转,history 通过 pushState/replaceState 改变 URL 而不刷新页面。
JavaScript 中没有一个叫 “BOM 对象” 的单一对象,window 才是 BOM 的核心和顶层对象,其他所谓 “BOM 对象” 实际上都是 window 的属性或内置接口。
BOM 这个构造函数或类?BOM(Browser Object Model)不是标准规范定义的正式 API 接口,而是对浏览器提供的一组非标准化、但被广泛实现的全局对象和能力的统称。它不像 DOM 那样有 W3C/WHATWG 标准文档约束,因此没有 new BOM() 这种用法,也没有 typeof BOM === 'object' 成立的情况。
常见误解是把 navigator、location、history、screen、document 当成“BOM 对象”,其实它们只是 window 的只读属性:
console.log(window.navigator === navigator); // true console.log(window.location === location); // true console.log(window.history === history); // true
location 和 history 的关键区别在哪?两者都用于控制浏览器地址栏和导航行为,但语义与权限完全不同:
立即学习“Java免费学习笔记(深入

location 是可读写的:赋值字符串(如 location.href = 'https://example.com')会立即跳转;修改 location.hash 或 location.search 也会触发页面重载或 hashchange 事件history 默认不能跨源跳转,且 history.pushState() 和 history.replaceState() 不触发页面刷新,仅改变 URL 和历史栈 —— 但必须配合 popstate 事件监听才能响应后退/前进history.go(-1) 或 history.back() 可能被浏览器限制(比如用户从未访问过前一页,或页面由 data: URL 打开)window 是浏览器环境的全局对象,而 iframe 拥有自己独立的 window 实例,Web Worker 则完全无 window —— 所以这些属性在不同上下文表现差异极大:
document:iframe 内可用,Worker 中报 ReferenceError: document is not defined
location:iframe 内指向自身 URL;Worker 中不存在,但可通过 self.location(只读)获取脚本路径navigator:iframe 和 Worker 中都存在,但 Worker 中部分属性如 navigator.geolocation 不可用localStorage/sessionStorage:iframe 同源时共享;Worker 中不可用(需用 indexedDB 替代)真正要注意的是:BOM 行为高度依赖运行环境(是否在 iframe、是否同源、是否启用 CORS、是否禁用 JS),很多看似“通用”的写法在嵌入场景下会静默失败或抛出安全错误 —— 比如 top.location.href = '...' 在跨域 iframe 中会触发 SecurityError,而不是跳转。