Подтвердить что ты не робот

Являются ли функции jQuery: first и: eq (0) функционально эквивалентными?

Я не уверен, следует ли использовать :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 */

Я предположил, что третий будет самым быстрым, а четвертый будет самым медленным, но здесь результаты, которые я придумал:

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)!

Если я не ошибаюсь.

4b9b3361

Ответ 1

Хороший вопрос, отличный пост. Я тестировал это некоторое время назад и не мог вспомнить точный результат. Я очень рад, что нашел это, потому что это именно то, что я искал.

Я бы предположил, что причина :first и :eq(0), являющаяся чуть медленнее, скорее всего связана с производительностью разбора. Опуская это, механизм jQuery может использовать собственные функции getElementsByTagName и getElementsByClassName.

Никаких сюрпризов i.t.o. элемент DOM является самым быстрым для доступа. Обтекание элемента DOM с помощью jQuery в цикле for не обязательно окажет отрицательное влияние на производительность, поскольку jQuery использует свойство expando для целей кэширования.

Однако было бы интересно посмотреть, как get(0) сравнивается с доступом к элементу DOM и как его упаковка в jQuery тарифицируется против eq(0) и остальных результатов.

Ответ 2

В соответствии с исходным кодом jQuery .first() является просто удобной оболочкой для .eq(0):

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

Ответ 3

Да, они эквивалентны.

Нет, они вряд ли будут существенно отличаться (что-то еще представляет собой микро-оптимизацию).