для ... в массиве выводит строки вместо чисел - PullRequest
0 голосов
/ 31 августа 2018
var xs=[]; for (var i in [1,2,3]) xs.push(i); console.log(xs);

Почему ["0", "1", "2"], а не [0, 1, 2]?

Я догадываюсь, что это связано с внутренней реализацией массива.
Массив в javascript можно рассматривать как {"0":1, "1":2, "2":3}?

РЕДАКТИРОВАТЬ: я пишу компилятор. Мне все равно, что мне не нужно использовать for in и массивы. Меня не волнует читаемость строки. Я хотел бы знать, почему ключи объекта массива являются строками, а не числами. Будем благодарны за любые утверждения из спецификации.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Проблема:

Цикл

for...in не предназначен для итерации по массиву, но предназначен для перечисления ключей объекта. Согласно документам по MDN :

for...in не должен использоваться для перебора массива, где важен порядок индекса.

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

Быстрое исправление:

Проблема с вашим кодом состоит в том, что оператор for (var i in [1,2,3]) возвращает индексы массива как i в теле цикла. Вы можете попробовать простое исправление в теле цикла:

var xs=[]; for (var i in [1,2,3]) xs.push([1,2,3][i]); console.log(xs);

Вы можете извлечь [1,2,3] в переменную, чтобы сделать код более читабельным.

Рекомендуемое исправление:

Вместо этого используйте Array#forEach. Он специально разработан для зацикливания массивов и стабилен во всех средах.

var xs=[]; [1,2,3].forEach(item => xs.push(item)); console.log(xs);
0 голосов
/ 31 августа 2018

Не зацикливать с in на массиве.

Петля с of:

 var xs=[];
 for (var i of [1,2,3]) xs.push(i);
 console.log(xs);

По существу, in зацикливается на ключах объекта, а of зацикливается на значении массива. «0», «1» и «2» являются ключами.

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