Почему "undefined" заканчивает цикл в JavaScript?
У меня возникли проблемы с пониманием того, как этот цикл for завершается в JavaScript:
var files = ["A", "B"];
for (var i = 0, f; f = files[i]; i++) {
console.log(f);
}
При запуске он отображает A и B на экране, но почему f = файлы [2] завершают цикл? Если я запустил f=files[2]
в моей консоли, я получаю ответ "undefined", так что же объясняет тот факт, что это должно закончиться циклом?
Бонусный вопрос: Почему бы не написать цикл вместо следующего?
for (var i=0; i < files.length; i++) {
f = files[i];
console.log(f);
}
Это кажется более ясным и более удобным для меня, поэтому есть ли какая-то причина, что первая часть кода будет использоваться во втором?
Ответы
Ответ 1
Цикл заканчивается, потому что undefined
является значением falsey.
Причина использования одного над другим - предпочтение пользователя. У вас есть предпочтение, когда кто-то предпочитает другой путь. Кто-то может захотеть использовать цикл while. Правильного пути нет.
Ответ 2
Массивы нумеруются начиная с нуля, поэтому array [] = [0,1,2]. Ваш код пытается инициализировать значение для файлов [2], которое является третьим местом в массиве, но ваш массив определяется только как имеющий 2 пробела. Поэтому, когда он видит, что он достиг конца массива, он выходит из цикла.
Что касается одной из петель, предпочитаемых другими, я бы предположил, что ваш второй цикл будет лучше, потому что первый из них по существу пытается назначить значение вне границ в массиве и не удается, поэтому он выходит. Я бы сказал, что второй безопаснее.
Ответ 3
Вы получили "undefined", только когда вы запускаете код в консоли. Потому что при запуске любого кода в консоли он вернет "undefined", если не вернет какие-либо вещи.
Ответ 4
for (ExpressionNoIn opt; выражение opt; выражение opt) Заявление
Первое выражение в выражении for
, если оно присутствует, проверяется на наличие ложной ошибки для выхода из цикла. undefined
- это ложь, так что это завершает цикл.
Что касается вопроса о бонусе, существует много способов написать этот цикл. Для меня код, который вы предложили, более читабельен. Сказав это, вы можете использовать Array.forEach
для повторения массивов в более поздних браузерах.
Ответ 5
Предпочитает for (var i=0; i < files.length; i++) {}
Рассмотрим arr = [0,1,2]
for (var i = 0; i < arr.length; i++) {}
будет корректно перебирать все элементы в массиве, но for (var i = 0, item; item = arr[i]; i++) {}
не будет (и не сможет выполнить полностью).
Обратите внимание, что ни одна из конструкций не подходит для обработки разреженных массивов (но опять же, вероятно, вы должны просто использовать и рассматривать ее как объект в этой точке).
Рассмотрите возможность использования Array.prototype.forEach
или for( var item in arr ) {}
при работе с разреженными массивами. Имейте в виду, что for( var item in arr ) {}
также вернет значения Array.prototype
и что Array.prototype.forEach
не реализован в каждом браузере.