【问题标题】:Selectors: Be specific on right-hand side?选择器:具体在右侧?
【发布时间】:2016-01-21 12:22:16
【问题描述】:

Learn jQuery 说:

在选择器的右侧要具体,不要具体 在左边。

// Unoptimized:
$( "div.data .gonzalez" );

// Optimized:
$( ".data td.gonzalez" );

我了解左侧的部分,但是要具体说明右侧尺寸的部分呢?这在现代浏览器上有多真实?据我所知,现代浏览器不使用 Sizzle 引擎。让我们修改我们的“未优化”示例,通过删除div,在右侧包含我们需要“特定”的事实:

// Unoptimized modification:
$( ".data .gonzalez" );

对于我们的“优化”示例(对于现代浏览器):

  1. 已调用 queryselectorall .data
  2. 在步骤 1 的结果集中将 getElementsByTagName 放在 td 上。
  3. 从步骤 2 的结果集中为 .gonzales 调用 queryselectorall

对比我们的“未优化修改”示例:

  1. 已调用 queryselectorall .data
  2. 从 1 的结果步骤中为 .gonzales 调用 queryselectorall

基本上,我们跳过了第 2 步。所以不会:

$( ".data .gonzalez" );

跑得比:

$( ".data td.gonzalez" );

让“特定于选择器右侧大小”的原则在现代浏览器中已过时?

【问题讨论】:

  • getElementsByClassNamequerySelectorAll 快(很多)对于简单的类:jsperf.com/getelementsbyclassname-vs-queryselectorall/18
  • @CodeiSir 是的,但这不是重点。问题是为什么你必须在右手边具体说明?为什么不直接删除 td 选择器。
  • @Cristy 这只是一个评论,而不是一个答案;)我想添加一些信息,因为在我看来他不知道 getElementsByClassName 选择器

标签: jquery


【解决方案1】:

使用此 HTML:

<div class="data">
  <table>
    <tr>
      <td class="gonzalez">test1</td>
      <td>test2</td>
      <td class="gonzalez">test3</td>
    </tr>
  </table>
</div>

Firefox 43:

$("div.data .gonzalez");$(".data td.gonzalez");$(".data .gonzalez"); 相等(+/- 84866 次操作/秒)。

Chrome 47:

$(".data .gonzalez"); 是最快的(+/- 166496 操作/秒)。

$("div.data .gonzalez");$(".data td.gonzalez"); 有点慢(+/- 163243 操作/秒)。

IE 11:

$(".data .gonzalez"); 是最快的(+/- 55015 操作/秒)。

$("div.data .gonzalez");$(".data td.gonzalez"); 有点慢(+/- 42490 操作/秒)

歌剧 34:

$(".data .gonzalez");$(".data td.gonzalez"); 是最快的(+/- 148887 操作/秒)。

$("div.data .gonzalez"); 有点慢(+/- 135785 次操作/秒)

Safari 5:

$("div.data .gonzalez");$(".data td.gonzalez");$(".data .gonzalez"); 相等(+/- 63560 次操作/秒)。

我在这里创建了一个测试:http://jsperf.com/compare-selector

【讨论】:

  • 相同的测试,但使用 querySelectorAll: jsperf.com/compare-selector/2 - 有趣的事实:它比 jQuery 快得多 :)
  • @CodeiSir Chrome 47 和这些结果差别不大。这是解析器在后台的工作方式(从右到左)而不是 Sizzle 引擎从右到左的工作方式吗?
猜你喜欢
  • 2021-08-29
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2022-01-07
  • 2017-04-29
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多