isSameNode()判断两变量是否指向同一DOM节点对象(内存地址相同),现代推荐用===替代;isEqualNode()判断两节点类型、属性、子节点结构及文本内容是否完全相同(值相等)。

isSameNode() 判断两个变量是否指向**同一个 DOM 节点对象(内存地址相同);isEqualNode() 判断两个节点是否具有**相同的类型、属性、子节点结构与文本内容(值相等,不要求是同一对象)。
isSameNode():检测节点引用是否完全一致
该方法返回 true 仅当两个变量引用的是浏览器中**完全相同的节点实例**。它不比较内容,只看底层对象标识。
生成Blender Python (bpy)脚本,该脚本使用node_groups API和GeometryNodeTree接口程序化地创建几何节点修改器树,用于参数化3D资产生成。
- 现代浏览器中已基本被
===运算符取代(推荐直接用严格相等判断) - 即使两个节点外观、属性、子元素一模一样,只要不是同一个对象,结果就是 false
- 示例:
const div1 = document.querySelector('div');<br> const div2 = document.querySelector('div');<br> console.log(div1.isSameNode(div2)); // false(不同查询返回不同引用)<br> console.log(div1 === div2); // false<br> console.log(div1.isSameNode(div1)); // true
isEqualNode():检测节点内容与结构是否等价
该方法深度比较两个节点的**类型、命名空间、属性名/值、子节点数量与递归内容**,类似“深相等”。适用于验证模板渲染、快照比对或测试断言。
- 忽略节点在 DOM 中的位置、父节点、事件监听器、自定义属性(如
__vue__)等运行时状态 - 对文本节点,会逐字符比较内容;对元素节点,会按顺序比对所有属性(包括布尔属性如
disabled)和子节点树 - 示例:
const a = document.createElement('div');<br> a.id = 'test';<br> a.innerHTML = 'hello';<br> const b = document.createElement('div');<br> b.id = 'test';<br> b.innerHTML = 'hello';<br> console.log(a.isEqualNode(b)); // true(结构与内容一致)
实际使用中的关键区别与注意事项
- 性能上:
isSameNode()/===是 O(1) 比较;isEqualNode()是 O(n),复杂度取决于节点树大小 -
isEqualNode()不比较textContent的空白处理细节(如换行、缩进),但会忠实比较原始 HTML 字符串生成的文本节点 - 某些属性(如
style)只比较内联样式字符串,不解析 CSS 计算值;class属性按字符串比对,不标准化空格顺序 - 动态添加的属性(如通过
el.dataset.foo = 'bar')会被纳入比较;但通过 JS 直接赋值的非标准属性(如el.customProp = 123)不会影响结果
替代方案与现代实践建议
- 优先用
===替代isSameNode(),语义更清晰且兼容性更好 - 对复杂比对需求(如忽略注释、标准化空格、跳过特定属性),建议使用专用库如 Lighthouse 的 dom-equals 或轻量工具函数
- 单元测试中验证 DOM 输出时,
isEqualNode()可作为基础断言,但更推荐结合innerHTML字符串快照或 DOM diff 工具提升可读性

















