最合适的方法:$($(".answer")[0])

min*_*eow 35 javascript performance jquery jquery-selectors

假设我想要获得该类的所有元素中的第一个元素".answer"

$($(".answer")[0])
Run Code Online (Sandbox Code Playgroud)

我可以做到这一点,但优雅和速度之间的最佳平衡是什么?

*改变了问题以反映当前的讨论

Yah*_*hel 73

我不能说优雅的方面,但这里的表现方面实际上可以产生巨大的差异.

它看起来像,从一组JavaScript的测试,你原来的方法实际上是高效的,并且违背了假设到了接受的答案挂,非CSS灒选择往往是比方法选择效率较低.这是有原因的.所述$('.answer')可以使用浏览器的本地getElementsByClass(),而不必手动遍历的结果.该:first选择那个复杂.在这种情况下,使用嘶嘶声选择器似乎会使选择速度减慢4-5倍.

我认为,使用jQuery,性能应该胜过优雅,所有证据(到目前为止我测试的每一个浏览器!)似乎都表明OP的优雅解决方案是最快的.

以下是测试运行次数最多的浏览器的结果:

在此输入图像描述

(这些数字是'每秒操作数',所以数字越高,数字越慢.)

  • 我认为在更复杂的文档树上运行测试也是有益的. (4认同)
  • 出于好奇,为什么你会认为使用jQuery,性能胜过优雅?我实际上反驳说,特别是如果用户无法区分. (4认同)
  • @Xavi对于一个选择,用户无法区分,但如果您正在构建一个jQuery密集的应用程序,这些差异可能会增加,特别是在低端浏览器中.如果一种方法比另一种方法快5倍,那么这种差异就会产生影响. (2认同)

Phr*_*ogz 56

以下都是功能相同的(虽然不是速度):

哪个最好?
已经假定了选择的版本应该比法版本快(和逻辑有一定的道理),但我还没有找到一个可靠的跨浏览器,多文档基准,证明这是真的.

在某些情况下,你不能使用选择器,因为你有一个由链式结果产生的jQuery对象,并且必须在以后削减它.

编辑:根据以下@ yc测试的优秀信息,以下是当前(2011年2月4日)的测试结果,总结并与以下基线进行比较.answer:first:

          :first  :eq(0)  .first()  .eq(0)  $($('...')[0])
Chrome 8+   100%     92%      224%    266%       367%
   FF 3.6   100%    100%      277%    270%       309%
  FF 4.0b   100%    103%      537%    521%       643%
 Safari 5   100%     93%      349%    352%       467%
 Opera 11   100%    103%      373%    374%       465%
     IE 8   100%    101%     1130%   1246%      1767%
 iPhone 4   100%     95%      269%    316%       403%
=====================================================
 Weighted   100%     92%      286%    295%       405%
    Major   100%     95%      258%    280%       366%
  • 加权线示出了由每个浏览器测试的数量加权的性能; 流行的浏览器(在那些测试中)被更强烈地计算.
  • 主要线路显示相同的,只包括主要的桌面浏览器的非测试版.

总之:假设(目前)是错误的.这些方法明显快于Sizzle选择器,几乎没有例外,OP的代码$($('.answer')[0])是最快的!

  • `:eq()`从零开始.也许你在考虑[:nth-​​child()](http://api.jquery.com/nth-child-selector/),这是一个基于一个? (4认同)
  • 只需为这些http://jsperf.com/selecting-the-first设置JSPerf.请在各种浏览器上运行:)我的第一次测试似乎表明,与假设相反,这些方法比sizzle选择器更快.这并不奇怪,因为已知非CSS Sizzle选择器非常慢. (4认同)
  • NB表中的百分比似乎是速度,而不是持续时间. (3认同)
  • 还要感谢汇总所有数据.为此+1. (2认同)

kar*_*m79 10

使用:first选择器或.first过滤方法:

$(".answer:first");
Run Code Online (Sandbox Code Playgroud)

要么:

$(".answer").first();
Run Code Online (Sandbox Code Playgroud)