是jQuery的:第一,:EQ(0)选择功能等同?(Are jQuery's :first

2019-06-28 02:04发布

我不知道是否要使用:first:eq(0)中选择。 我敢肯定,他们将永远返回相同的对象,但其中一个比另一个更快速?

我敢肯定有人在这里一定基准之前这些选择,我真的不知道测试的最好方式,如果一个比较快。

更新:这是我跑的替补:

/* start bench */
for (var count = 0; count < 5; count++) {
    var i = 0, limit = 10000;
    var start, end;
    start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:eq(0)");
    }
    end = new Date();
    alert("div.RadEditor.Telerik:eq(0) : " + (end-start));
    var start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:first");
    }
    end = new Date();
    alert("div.RadEditor.Telerik:first : " + (end-start));
    start = new Date();
    for (i = 0; i < limit; i++) {
        var radeditor = $thisFrame.parents("div.RadEditor.Telerik")[0];
    }
    end = new Date();
    alert("(div.RadEditor.Telerik)[0] : " + (end-start));
    start = new Date();
    for (i = 0; i < limit; i++) {
        var $radeditor = $($thisFrame.parents("div.RadEditor.Telerik")[0]);
    }
    end = new Date();
    alert("$((div.RadEditor.Telerik)[0]) : " + (end-start));
}
/* end bench */

我认为第三个将是最快的,第4是最慢的,但在这里,我想出了一个结果:

FF3:    :eq(0)  :first  [0] $([0])
trial1  5275    4360    4107    3910
trial2  5175    5231    3916    4134
trial3  5317    5589    4670    4350
trial4  5754    4829    3988    4610
trial5  4771    6019    4669    4803
Average 5258.4  5205.6  4270    4361.4

IE6:    :eq(0)  :first  [0] $([0])
trial1  13796   15733   12202   14014
trial2  14186   13905   12749   11546
trial3  12249   14281   13421   12109
trial4  14984   15015   11718   13421
trial5  16015   13187   11578   10984
Average 14246   14424.2 12333.6 12414.8

我正要返回刚才的第一款原生DOM对象是正确最快( [0]但我不能相信jQuery的函数对象包装也较快,这两个:first:eq(0)

除非我做错了。

Answer 1:

2018:是的, :first:eq(0)返回相同的结果,虽然性能上的差异是微乎其微,也许在2018年甚至是微不足道的。

2010:很好的问题,伟大的职位。 我有些不久前测试过这个,可能不记得确切的结果。 我真的很高兴找到了这一点,因为这正是我一直在寻找。

我猜想,对于原因:first:eq(0)是一点点慢是最有可能与解析性能。 省略这些允许jQuery的引擎,利用原生getElementsByTagNamegetElementsByClassName的功能。

没有意外ITO的DOM元素是最快的访问。 包装与jQuery的DOM元素在for循环中不一定会对性能产生不利影响的jQuery让使用expando属性为缓存目的。

然而,就看怎么是有趣get(0)与DOM元素访问和如何比较jQuery的包装中抗票价eq(0)结果的其余部分。



Answer 2:

据jQuery的源代码, .first()仅仅是一个方便的包装.eq(0)

first: function() {
    return this.eq( 0 );
},


Answer 3:

是的,他们是等价的。

不,他们是不太可能是显著不同(别的是微优化)。



文章来源: Are jQuery's :first and :eq(0) selectors functionally equivalent?