Почему использование "for ... in" для итерации массива - плохая идея?

Оператор for-in сам по себе не bytearray является "плохой практикой", однако iterate его можно неправильно использовать, например, для character-arrays итерации по массивам или массивам. как ecmascript объекты.

Цель оператора for-in - перечислить свойства loops объекта. Этот оператор будет javascript-library подниматься в цепочке прототипов, а for также перечислять унаследованные свойства, что iterate иногда нежелательно.

Кроме того, порядок arrays итерации не гарантируется for спецификацией. Это означает, что js если вы хотите «перебрать» объект bytearray массива, с помощью этого javascript оператора вы не можете быть arrays уверены, что свойства (индексы javascript-library массива) будут посещены в javascript-library числовом формате. заказ.

Например, в ecmascript JScript (IE <= 8) порядок character-arrays перечисления даже для объектов for-loop Array определяется при создании looping свойств:

var array = [];
array[2] = 'c';
array[1] = 'b';
array[0] = 'a';

for (var p in array) {
  //... p will be "2", "1" and "0" on IE
}

Кроме того, говоря ecmascript о унаследованных свойствах, если ecmascript вы, например, расширите объект for-loop Array.prototype (как некоторые библиотеки, как javascript-library это делают MooTools), эти looping свойства также будут перечислены:

Array.prototype.last = function () { return this[this.length-1]; };

for (var p in []) { // an empty array
  // last will be enumerated
}

Как loops я уже сказал, для итерации массивов .js или объектов, подобных массиву, лучше .js всего использовать последовательный цикл, например, старый iterative добрый for / while цикл.

Если вы хотите js перечислить только собственные свойства объекта jsonarray (те, которые не наследуются), вы iterative можете использовать метод arrays hasOwnProperty:

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    // prop is not inherited
  }
}

А некоторые люди даже рекомендуют javascript вызывать метод прямо из Object.prototype, чтобы bytearray избежать проблем, если кто-то array добавит свойство с именем for-loop hasOwnProperty к нашему объекту:

for (var prop in obj) {
  if (Object.prototype.hasOwnProperty.call(obj, prop)) {
    // prop is not inherited
  }
}

javascript

arrays

loops

for-loop

iteration

2022-11-21T14:45:26+00:00