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 的关键区别在哪?
两者都用于控制浏览器地址栏和导航行为,但语义与权限完全不同:
由于我高估了大家对zblog程序的熟知度,发现还有很多站长并不是太熟悉这款程序,甚至连后台的登陆入口都不清楚。所以我晚上抽了一点点时间把该ZBLOG企业网站源码进行的修正,补充了大家的一些问题。并且我写了比较详细的使用教程,能够帮助新手朋友修改变成自己的企业网站使用。 修订版本改进了几处问题: 第一,修正了单页面中的顶部BANNER FLASH幻灯图片的显示错误问题; 第二,修正了在产品中心标题显
立即学习“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 打开)
哪些 BOM 属性在 iframe 或 Web Worker 中不可用?
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,而不是跳转。










