class 选择器为什么比 attribute 选择器快?帮你翻开blink源码。

话不多说,让我们从大家常用的 Node.querySelectorAll 的 blink 源码入手,逐步分析这个问题:

我们调用它时 Node.querySelectorAll 做了哪些事?

翻了下源码,这个函数似乎很简单,其中主要逻辑位于Execute函数中:

Execute函数中,我们可以看到两个逻辑:

  1. 如果 use_slow_scan_ 为true,则会进入到 ExecuteSlow,走慢速查询。
  2. 如果 use_slow_scan_ 为false,如果是class选择器,则会执行 CollectElementsByClassName函数

看起来我们似乎找到了答案?再深究一下。

看起来我们似乎找到了答案,class 选择器为什么比 attribute 选择器快?因为blink中为class选择器做了特殊处理。

而做了啥处理呢?我们来看看函数逻辑,看起来似乎很简单,就是只检查后代所有元素中有class的元素。

而ExecuteSlow慢在哪呢?看代码我们知道,因为他是一个通用的函数,他会处理遍历检查所有后代元素,用所有css规则去做判断,自然会慢于只判断class的CollectElementsByClassName函数。

那么 use_slow_scan_是谁设置的、以什么逻辑设置的呢?

其实看到源码就很简单,当且仅当一个选择器时。

总结:

当且仅当一个选择器时,那么class会比attribute快,因为class选择器心无旁骛只找class,而attribute走的是通用规则处理的逻辑,会有更多逻辑。


最后,祝好。

我是尘码,有其他想从chrome源码找答案的问题,欢迎评论。

也欢迎来我 Fanbook ( 一个国内类似discord的免费平台 ) 来找我吹水聊天 ,频道邀请码如下:

in.fanbook.cn/CIe6NFQD

相关推荐
lichenyang4539 分钟前
从 Express 老项目到 NestJS + Docker:一次车辆管理系统的渐进式重构
前端
Momo__1 小时前
VueUse createReusableTemplate —— 单文件组件内的模板复用神器
前端·vue.js
程序员小富1 小时前
我开源了一个开发者专属的智能 JSON 工具,得到了媳妇高度认可
前端·vue.js·后端
小小小小宇1 小时前
程序员如何给 LLM 装工具以及看懂推理过程
前端
写代码的皮筏艇1 小时前
React中的forwardRef
前端·react.js·面试
槑有老呆2 小时前
花三个月工资请了个 AI 程序员,结果它连青岛啤酒股价都查不了
前端
风骏时光牛马2 小时前
Verilog开发常见问题汇总解析
前端
子兮曰2 小时前
AI Coding Method Map:一张图看懂 AI 编程的完整链路
前端·人工智能·后端
weedsfly2 小时前
语法糖褪去之后——Babel 转译产物中的 JavaScript 本貌
前端·javascript