Это микрооптимизация в лучшем случае.Если у вас нет сотен тысяч элементов в вашем массиве 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
следует использовать для итерации по объекту .