javascript中的BOM对象有哪些【教程】

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' 成立的情况。

常见误解是把 navigatorlocationhistoryscreendocument 当成“BOM 对象”,其实它们只是 window 的只读属性:

console.log(window.navigator === navigator); // true
console.log(window.location === location);     // true
console.log(window.history === history);       // true

locationhistory 的关键区别在哪?

两者都用于控制浏览器地址栏和导航行为,但语义与权限完全不同:

  • location 是可读写的:赋值字符串(如 location.href = 'https://example.com')会立即跳转;修改 location.hashlocation.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.locati

on.href = '...' 在跨域 iframe 中会触发 SecurityError,而不是跳转。