是$('。foo')。eq(0)比$('。foo')快吗?

时间:2011-08-06 14:58:22

标签: javascript jquery performance

假设我有一个庞大的元素列表,其结构如下:

<div class="item">
    <div class="header"></div>
    <div class="body"></div>
    <div class="meta"></div>
    <div class="..."></div>
    ...
</div><!-- .item -->

我已经找到了一个元素,现在我必须找到一个'.body'。什么代码可以更快地运行:

$(el).find('.body')

$(el).find('.body').eq(0)

换句话说,jQuery会在第一个找到的元素上停止,还是先循环遍历所有元素,然后才会返回一个带有所选索引的元素?

5 个答案:

答案 0 :(得分:6)

这个问题太荒谬了。 “如果我添加另一个函数或者我将它排除在等式之外会更快吗?”基本上就是你所要求的:

$(el).find('.body')的速度提高了约6-7倍:http://jsperf.com/to-eq-or-not-to-eq

答案 1 :(得分:1)

您的第二个示例将始终较慢,因为它仅在包含与.body匹配的所有元素的jQuery对象上调用其他方法。

获取第一个匹配元素的最快方法可能是:first选择器:

$(el).find(".body:first")

您还可以使用context参数$()来保留一个方法调用,benchmarks显示实际上更慢

$(".body:first", el)  // Slower, don't do that.

答案 2 :(得分:1)

.eq(0)是对$(el).find('.body')返回的对象的方法调用。它不能比单独$(el).find('.body')更快。

答案 3 :(得分:0)

它们与在.eq('0')结果上调用的find('.body')几乎相同。第二个是从不更快。

答案 4 :(得分:0)

$(el).find('.body:first')$(el).find('.body.eq(0)')在逻辑上会更快,因为(至少)它执行较少的函数调用