For... in loop с индексами строковых массивов

Когда я пишу несколько javascript, например:

var words = ['word1', 'word2', 'word3']

for (word in words) {
    console.log(word)
}

Результирующий вывод - это числовые индексы соответствующего слова. Я сделал некоторые поиски в Google, и я не мог найти точную причину такого поведения. Я предполагаю, что это вполне ожидаемое поведение, но я хотел бы знать причину.

Спасибо!

Ответ 1

Почему никто не дает правильного ответа? Вы НИКОГДА не перезапускаете массивы с помощью цикла for/in - это только для итерации простых объектов и их ключей, а не для итерации элементов в массиве.

Вы повторяете массивы для цикла for следующим образом:

var words = ['word1', 'word2', 'word3'];

for (var i = 0, len = words.length; i < len; i++) {
    // here words[i] is the array element
}

Или в современном браузере вы можете использовать метод массивов .forEach():

var words = ['word1', 'word2', 'word3'];

words.forEach(function(value, index, array) {
    // here value is the array element being iterated
});

Подробнее о .forEach() см. здесь, в MDN.

Ссылка ndp на этот пост показывает некоторые хорошие примеры вещей, которые могут пойти не так, используя for/in с массивами. Вы можете заставить его работать иногда, но это не умный способ итерации массива Javascript.


Или в более современное время вы можете использовать конструкцию ES6 for/of, которая специально создана для итерации итерации (массив является итерабельным):

var words = ['word1', 'word2', 'word3'];

for (const w of words) {
    console.log(w);
}

Или, если вы хотите как значение, так и индекс, вы можете сделать это:

var words = ['word1', 'word2', 'word3'];

for (const [index, w] of words.entries()) {
    console.log(index, ": ", w);
}

Существует несколько преимуществ for/of над .forEach(). Для начала у вас больше управления контуром, так как вы можете использовать break, continue, return для управления потоком цикла, который .forEach() не дает вам. Кроме того, нет дополнительных накладных расходов для функции обратного вызова, поэтому в некоторых средах она может быть быстрее.

Ответ 2

  • for..in используется для итерации по свойствам объекта javascript.
  • Вспомните массив как объект javascript с индексами как свойствами.

Ответ 3

For ... in предназначен для объектов - см. этот вопрос. По-видимому, он может (и используется) использоваться для массивов, но у вас есть несколько рисков, которые вы, возможно, не захотите.

Ответ 4

Как правильно указывают другие ответы, for...in не для итерации по массивам. Лучший вариант теперь доступен в новых машинах JavaScript и транспилерах типа TypeScript с for...of:

var words = ['word1', 'word2', 'word3']

for (word of words) {
    console.log(word)
}