用 === 判断两个 dom 节点是否为同一对象最准确高效,因其直接比较内存引用,不触发转换或方法调用;而 == 有隐式转换风险,isequalnode() 比较的是结构等价性而非引用。

直接用全等运算符 === 判断就行。两个 DOM 节点变量如果引用的是内存中同一个对象,a === b 就返回 true;否则为 false。
为什么用 === 而不是 == 或其他方法
DOM 元素是对象,JavaScript 中对象比较默认比的是引用(地址),不是内容或结构。所以:
-
===是最准确、最快、最安全的方式 —— 它不做强制类型转换,也不触发任何 getter 或方法调用 -
==在绝大多数情况下和===行为一致,但存在隐式转换风险(比如与null、undefined比较时),没必要用 - 不用
isEqualNode():它比对的是节点的“内容等价性”(如 tagName、属性、子节点结构是否相同),不是“是否同一个对象”。两个独立创建的<div> 可能 <code>isEqualNode()返回true,但绝不是同一个节点 - 不用
node.id或node.isEqualNode()等间接方式:既慢又不可靠,还可能误判 - 事件处理中防止重复绑定:
if (!handlerSet.has(target)) { target.addEventListener('click', fn); handlerSet.add(target); } - 缓存 DOM 节点时做去重:
const cache = new WeakMap(); cache.set(el, data);(WeakMap 天然依赖引用相等) - 判断某个元素是否就是当前高亮项:
if (el === currentActiveEl) { ... } - 在操作前校验节点未被移除或替换:
if (el.parentNode && el === cachedEl) { el.remove(); } -
document.getElementById('x')调用两次,返回的是同一个元素对象(只要没被销毁)—— 所以可以放心用=== -
querySelector每次调用都返回新引用?不,它返回的是文档中已存在的那个真实节点,多次调用仍指向同一对象 - 但
cloneNode(true)创建的是全新节点,即使结构完全一样,===也返回false - 跨 iframe 的节点属于不同 JS 执行环境,哪怕 DOM 结构一模一样,它们的构造函数甚至都不相等(
el instanceof Element在父窗口里可能报错),更不可能=== - 打印
el看控制台是否显示相同地址(现代浏览器控制台通常会标注div#myid.some-class后跟[object HTMLDivElement],多次打印同一节点会显示相同标识) - 检查
el.compareDocumentPosition(other):若返回0,说明是同一节点(该方法本用于比较位置关系,但规范明确:同一节点时返回0) - 注意:
el === other是唯一权威、零开销、无需兼容性考虑的判定方式
常见使用场景
这些地方经常需要确认是不是“同一个节点”:
需要注意的边界情况
看似一样,其实不是同一个节点的情况很常见:
补充:如何确认两个变量确实指向同一 DOM 元素
除了 ===,还可以辅助验证:











