Почему "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 не реализован в каждом браузере.