Почему javascript превращает индексы массива в строки при итерации?

Эта логика Javascript меня озадачивает. Я создаю массив и устанавливаю первый его элемент на число. Когда я взаимодействую с ним, используя цикл "for", Javascript превращает ключ массива в строку. Зачем? Я хочу, чтобы он остался номером.

stuff = [];
stuff[0] = 3;

for(var x in stuff) {
    alert(typeof x);
}

Ответ 1

Это потому, что вы зацикливаете массив, используя for...in, который обычно используется для перебора свойств объектов. Механизм javascript, вероятно, относится к строке, потому что тип строки подходит для имен свойств объекта.

Попробуйте этот более традиционный подход:

stuff = [];
stuff[0] = 3;

for(var i=0; i<stuff.length; i++) {
    var x = stuff[i];
    alert(typeof x);
}

Ответ 2

for..in не предназначен для перебора массивов. Вместо этого используйте C-стиль для цикла.

Ссылка: MDC

Ответ 3

Цикл for .. in в Javascript выполняет итерацию через свойства объекта. В Javascript имена свойств - это строки, а массивы - это просто объекты с кучей свойств, которые выглядят как цифры.

Ответ 4

Оператор for...in должен использоваться для перебора свойств объекта, поскольку в массиве используется простой цикл for:

var stuff = [];
stuff.push(3);

for(var i = 0; i < stuff.length; i++) {
  alert(stuff[i]);
}

Почему не следует использовать for...in с массивами?

  • Он обходит цепочку прототипов, он будет перебирать свойства, определенные в Array.prototype или Object.prototype.
  • Порядок итераций в любом случае не гарантируется.

Подробнее о недавно отвеченном вопросе:

Ответ 5

Избегайте "in-in" в функции, зависящие от производительности.

  • The for-in loop requires the script engine to build a list of all the enumerable properties и проверьте наличие дубликатов в этом списке, прежде чем он сможет начать перечисление.
  • The for-in loop breaks when you extend Array object using prototype.

Ответ 6

Проблема в том, что в JavaScript очень легко переключаться на ассоциативные массивы, которые на самом деле не массивы, а объекты. Однако цикл for..in работает с объектами, индексы которых являются строками.