Итерация сравнения производительности - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть массив:

deleteIds= ["User1"];

и я пытаюсь перебрать его как:

первый:

for (var index = 0; index < len; index++) {
    alert(deleteIds[index]);
}

второй:

for (var index in deleteIds) {
    alert(deleteIds[index]);
}

Какое сравнение производительности у них?

1 Ответ

5 голосов
/ 22 сентября 2011

Это микрооптимизация в лучшем случае.Если у вас нет сотен тысяч элементов в вашем массиве deleteIds, вам не следует оптимизировать это.

Оказывается, версия for(;;;) работает быстрее, чем for in: http://jsperf.com/iterating-over-a-loop/2 (спасибо @Jamiec за jsperf ).

Однако, что более важно, чем сравнение производительности, это то, что оба фрагмента кода функционально отличаются друг от друга ( живой пример ).

var array = new Array(100);
for (var i = 0; i < array.length; i++) {
    console.log(i); // shows 0 - 99
}

for (var x in array) {
    console.log(x); // shows nothing
}

Кроме того, если вы добавляете методы либо в массив, либо в объект в цепочке прототипов массивов, они будут отображаться в цикле for (var x in y), но не в for (;;;); ( live примере):

Array.prototype.foo = function() {};
var array = [];
for (var i = 0; i < array.length; i++) {
    console.log(i); // nothing
}

for (var x in array) {
    console.log(x); // `foo`
}

Вы можете использовать hasOwnProperty, чтобы исключить атрибуты, унаследованные от цепочки прототипов, но это не остановит получение вами методов непосредственно от объекта ( live example ):

Array.prototype.foo = function() {};
var array = [];
array.bar = function () {};

for (var i = 0; i < array.length; i++) {
    console.log(i); // nothing
}

for (var x in array) {
    if (array.hasOwnProperty(x)) {
        console.log(x); // `bar`
    }
}

По этим причинам использование for in для перебора массива не рекомендуется, и вместо него следует использовать for(;;;) версию всегда .for in следует использовать для итерации по объекту .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...