JavaScript中比较两个DOM元素的最高效方式,事件场景下哪种更快?
三种判断逻辑的性能对比
三种元素比较方式的运行速度有明确的层级差异,核心区别来自底层操作的实际开销:
- 最快实现:
event.srcElement === txtKeyword
引用类型的严格相等判断,本质是直接比对两个变量持有的DOM节点内存指针。整个过程没有隐式类型转换、属性查找、值遍历的额外步骤,单操作耗时在纳秒级。由于你已经在页面初始化时通过getElementById缓存了txtKeyword的DOM引用,事件回调里的event.srcElement本身也是触发事件的DOM节点引用,两个值都是直接的内存指针,比对过程没有任何冗余损耗。 - 次一级实现:
event.srcElement == txtKeyword
非严格相等的判断逻辑比严格相等多了一层隐式类型转换校验:引擎需要先判断两边值的类型,确定是否需要做类型转换后再执行比对。虽然当两边都是DOM节点时,最终依然走指针比对逻辑,但额外的类型判断分支会带来10%~30%的额外耗时,在高频触发的keypress事件里,长期运行的累积开销会比严格相等更明显。 - 最慢实现:
event.srcElement.id == "txtKeyword"
这个逻辑的开销和前两者不在一个量级:首先需要从触发源DOM节点上读取id属性的值,哪怕现代浏览器对id属性做了缓存优化,属性读取本身也比直接的指针比对多了一层对象属性查找流程;其次是字符串比对,需要逐字符匹配id的文本内容,一旦id长度较长,比对耗时会随着字符串长度线性上涨,整体性能和严格相等比对可以差一个数量级。
DOM元素比较的最优方案
只要提前缓存了目标DOM的引用,直接使用===严格相等比对两个DOM节点,就是JavaScript场景下最快的元素比较方式,不存在性能更优的替代方案。
- 高频事件回调里要尽量避免临时读取元素属性(id、class、自定义属性等)做匹配判断,这类带属性查找的逻辑,性能远低于直接的引用比对。
- 现有代码的兼容提示:
event.srcElement是早期IE的非标准属性,现代W3C标准事件对应的触发源属性是event.target,上线前建议做兼容兜底,避免在标准浏览器环境下获取不到正确的事件触发元素。
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

