Почему 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
работает с объектами, индексы которых являются строками.