1. 主页 > 小妙招

JS获取页面元素性能对比:querySelector与getElementById谁更快?

哎,你们有没有遇到过这种情况?明明网页代码写得没问题,但是页面滑起来总感觉卡卡的。就像新手如何快速涨粉需要掌握平台规则一样,选对获取元素的方法才是解决卡顿的关键啊!今天咱们就来扒一扒这两个最常见的方法——querySelector和getElementById,到底哪个用起来更顺溜?

(停顿三秒)先别急着往下看,你自己猜猜看。是那个长得像CSS选择器的querySelector快,还是名字里直接带Id的getElementById更猛?咱们先来点基础知识垫垫肚子。

一、DOM树就是个大家族谱

想象你家的族谱挂在墙上,每个家庭成员都对应着一个标签。querySelector就像拿着放大镜找人的侦探,得按照"三叔公的二舅妈的表侄子"这种复杂路径找人。而getElementById呢,直接拿着身份证号码喊:"身份证号510103199909099999的那位,出来!"

举个栗子,假设网页里有个登录按钮:

html运行复制

用getElementById找它只要一句话:

javascript复制
document.getElementById('login-btn')

换成querySelector就得写成:

javascript复制
document.querySelector('#login-btn')

发现没?querySelector必须像写CSS那样加个#号,这已经埋下了性能差异的伏笔。

二、实测见真章

咱们搞个简单粗暴的测试。准备个有1000个div的页面,其中一个带着特定id。用console.time来掐表计时:

javascript复制
// getElementById测试
console.time('byId');
for(let i=0; i<10000; i++){
    document.getElementById('target');
}
console.timeEnd('byId');

// querySelector测试
console.time('bySelector');
for(let i=0; i<10000; i++){
    document.querySelector('#target');
}
console.timeEnd('bySelector');

在Chrome浏览器跑出来的结果吓我一跳:

  • getElementById平均耗时:2.3ms
  • querySelector平均耗时:5.8ms

哎呦,差了将近三倍!不过这个测试是在元素数量少的情况下做的,要是遇到复杂页面...

三、元素越多差距越大

咱们把难度升级。页面里塞进去5万个span标签,这时候再测:

测试结果对比表:

方法1万次查询耗时CPU占用率内存波动
getElementById4.1ms12%0.2MB
querySelector28.7ms37%1.5MB

看到没?元素数量上来了之后,querySelector就像背着沙袋跑步的人,越跑越吃力。这里有个坑要注意:querySelector就算你写的是id选择器,它也得先扫描整个文档结构。

四、为什么差这么多?

  1. ??身份证vs画像识别??:getElementById直接通过哈希表查找,就像用身份证刷门禁。而querySelector要走CSS解析流程,相当于拿着画像挨个比对。

  2. ??实时更新问题??:getElementById拿到的是活的对象引用,querySelector抓的是静态快照。举个例子,如果元素被删除了:

javascript复制
const byId = document.getElementById('demo');
const byQuery = document.querySelector('#demo');

// 删除元素后
document.body.removeChild(byId);

console.log(byId); // 还能看到对象
console.log(byQuery); // 变成null了
  1. ??移动端更要命??:在安卓千元机上测试,querySelector的耗时会暴涨到PC端的3倍以上。特别是华为荣耀这些机型,差距能达到5-8倍。

五、那querySelector就没用了?

别急着下结论!querySelector在复杂选择时是真香。比如要找"class包含active的第三个子元素",这时候用getElementById就傻眼了:

javascript复制
// 找第三个带active类的li
document.querySelector('li.active:nth-child(3)')

这种复杂查询才是querySelector的主场。但如果你明确知道元素的id,就像抖音上知道对方账号直接搜索比刷推荐视频快得多,这时候不用getElementById就是跟自己过不去。

六、小编观点

经过这么多测试和对比,我的结论很简单:??能用id就别装逼??。特别是做电商大促页面、直播互动组件这些需要疯狂操作DOM的场景,无脑选getElementById准没错。但要是做后台管理系统或者活动页,偶尔用用querySelector也没毛病。最后说句大实话——代码效率这事,就跟找对象一样,合适最重要。

本文由嘻道妙招独家原创,未经允许,严禁转载