dom对象是htmldocument实例且属于文档树,bom对象是window等实例且独立于html结构;需通过构造函数、nodetype、标准化程度及归属关系综合判断。

DOM 和 BOM 对象在 JavaScript 中都通过 window 暴露,但它们的类型、用途和行为有本质区别。检测时不能只看 typeof(因为多数都是 "object"),而应结合构造函数、原型链、可访问性及标准规范来判断。
看顶层对象和构造函数
DOM 的核心是 document,它是一个 HTMLDocument 实例(继承自 Document);BOM 的核心是 window,它本身是 Window 构造函数的实例。
-
document.constructor === Document或document instanceof Document→ 典型 DOM 对象 -
window.constructor === Window或window instanceof Window→ 典型 BOM 对象(注意:window也是全局对象,所以window === this) -
location.constructor === Location、history.constructor === History、navigator.constructor === Navigator→ 都是 BOM 内置对象,非 DOM 节点
查是否属于文档树结构
DOM 对象一定参与或源自文档树(如元素、文本、注释节点),而 BOM 对象完全独立于 HTML 结构。
-
element.nodeType存在且为 1(元素)、3(文本)、8(注释)等 → 是 DOM 节点 -
element.parentNode、element.children、element.ownerDocument可正常访问 → 属于 DOM 树 -
location.href、screen.width、alert等无nodeType、无父节点、不挂载在document上 → 是 BOM 接口
验标准化与跨浏览器一致性
DOM 接口由 W3C 规范定义,方法名和行为高度统一;BOM 接口无统一标准,部分属性/方法在不同浏览器中可能缺失或行为不同。
-
document.querySelector、element.addEventListener在所有现代浏览器中存在且语义一致 → DOM 方法 -
window.open行为基本一致,但window.resizeTo在多数现代浏览器中已被禁用(仅限弹窗且需用户触发)→ BOM 方法,但受策略限制 -
navigator.vendor在 Chrome 返回"Google Inc.",Safari 返回空字符串 → BOM 属性,实现不统一
辨对象归属关系
所有 DOM 对象都可通过 window.document 访问,是 window 的子属性;而 BOM 对象虽也挂在 window 上,但本身不依赖 document 存在。
-
'document' in window→true,且window.document === document -
'location' in window→true,但location不是document的一部分,document.location是只读别名(实际指向window.location) -
document.location === window.location→true,但这是历史兼容设计,不代表location是 DOM 对象











