javascript - 为什么 Document.querySelector 比 Element.querySelector 更高效

标签 javascript performance selector microbenchmark

我做了几次迭代测试来测试 Document.querySelector 的效率和 Element.querySelector .

标记:

<form>
  <input type="text" />
</form>

脚本:

查询 Document.querySelector

begin = performance.now();

var 
  i = 0,
  iterations = 999999;

for ( i; i < iterations; i++ ) 
{
 element = document.querySelector('[type="text"]');
}

end = performance.now();

firstResult = end - begin;

查询 Element.querySelector

begin = performance.now();

var 
  i = 0,
  iterations = 999999,
  form = document.querySelector('form');

for ( i; i < iterations; i++ ) 
{
 element = form.querySelector('[type="text"]');
}

end = performance.now();

secondResult = end - begin;

日志:

console.log( firstResult ); // 703.7450000001118

console.log( secondResult ); // 1088.3349999999627

日志 对我来说太棒了,因为我认为 Element.querySelector仅查询元素和 Document.querySelector 的后代节点查询当前文档的所有节点,对吗?

为什么会得到这个结果?

最佳答案

根据我上面的评论,选择器会考虑整个文档,然后过滤项目以检查它们是否是目标的后代。所以它很可能仍然需要扫描整个 DOM 树,就像 document.querySelector 需要做的那样。

有一个问题的讨论(这仍然是当前的行为)here .您会在下面的代码示例中看到结果包含了 span,因为它不能单独查询 foo 下的项目。

Fiddle

代码:

document.body.innerHTML = '<div><p id="foo"><span></span></p></div>';
var foo = document.getElementById('foo');
alert( foo.querySelectorAll('div span').length);

关于javascript - 为什么 Document.querySelector 比 Element.querySelector 更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430923/

相关文章:

javascript - jQuery - 防止可排序元素在拖动开始后返回可排序列表

javascript - 安装和使用特定 npm 包时遇到问题。我究竟做错了什么?

performance - 具有空值的 JPA/Hibernate 查询优化

java - Java 中简单文件搜索的性能

javascript - 如何正确存储复杂的 jquery 选择器链以供重用?

javascript - 伪经典与 "The JavaScript way"

javascript - 通过 Axios 向 Firebase Cloud Function 发送 POST 请求

java - 在 byteArray 中存储图像时的内存问题

css - sass 是否支持如下使用父选择器?

ios - swift 3.0 : Timer not firing for target other than self