是jQuery的:第一个和:eq(0)选择器功能相同吗?

tra*_*vis 16 benchmarking jquery jquery-selectors

我不确定是使用: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 */
Run Code Online (Sandbox Code Playgroud)

我认为第3个是最快的,第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
Run Code Online (Sandbox Code Playgroud)

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

除非我做错了.

Álv*_*lez 13

根据jQuery的源代码,.first()它只是一个方便的包装器.eq(0):

first: function() {
    return this.eq( 0 );
},
Run Code Online (Sandbox Code Playgroud)


Wyn*_*ndB 7

2018年:是的,:first并且:eq(0)返回相同的结果,尽管性能差异在2018年是微不足道的,甚至可能是微不足道的.

2010年:好问题和好帖子.我前段时间对此进行了测试,并且无法记住确切的结果.我很高兴找到这个,因为它正是我所寻找的.

我猜想,原因:first:eq(0)速度稍慢的原因很可能与解析性能有关.省略这些允许jQuery引擎利用本机getElementsByTagNamegetElementsByClassName函数.

毫无疑问,DOM元素访问速度最快.在for循环中使用jQuery包装DOM元素不一定会对性能产生负面影响,因为jQuery使用expando属性进行缓存.

但是,看看如何get(0)与DOM元素访问进行比较以及jQuery包装如何eq(0)与其他结果进行比较将会很有趣.


cle*_*tus 6

是的,他们是等同的.

不,它们不太可能有显着差异(其他任何东西都是微优化).