Если вы хотите сделать хитрую одну линию стиля петли, «правильный» синтаксис:
var array = ['a', 'b', 'c'];
for (var i = 0, rowName; rowName = array[ i++ ];) {
console.log(rowName);
}
Обратите внимание на окончание ;
декларации в for
цикла. Технически существует пустое заявление после ;
, где вы обычно делаете i++
.
В этом случае «условие» цикла for использует оператор присваивания Javascript. Если у вас есть такой код:
var a;
if(a = 1) { // Note this is assignment = not comparison ==
console.log('true');
}
Это будет журнал «правда». Зачем? Потому что внутри выражения a = 1
фактически возвращает 1
. И 1
является «правдивым», что означает, что он оценивается как истинный в булевом контексте, таком как оператор if
.
Обратное также верно, если значение falsey:
var a;
if(a = 0) {
console.log('true');
}
Это не журнал, потому что a = 0
возвращается 0 (а также назначая от 0 до a
). И 0 ложно.
Этот эксцентричный для цикла синтаксис только для определенных условий:
- Если какой-либо из элементов массива являются «falsey» (
null
, undefined
, ""
и т.д.), она будет преждевременно завершает цикл, из-за как работают операторы, как указано выше.
- Это предполагает, что вам не нужен индекс цикла
i
. Он будет отключен на 1 для каждой итерации цикла, потому что i++
выполнен доfor
блок. То есть при первом выполнении вашего тела for
i
будет 1, а не объявленным начальным значением 0.
- Единственное преимущество этого шаблона заключается в сохранении нескольких байтов. Обычно это не используется в реальном мире из-за вышеупомянутых двух подводных камней.
Окончательное выражение оценивается только на * конце * каждой итерации цикла. «rowName» до этого не определено. См. [For @ MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) – showdev
Третье (и второе) выражение в цикле 'for' не является оценивается до конца каждой итерации. Если бы он был оценен заранее, чтобы назначить 'rowName', он также сразу увеличит' i' до '1', пропустив начальное значение' 0'. –
Документация вряд ли может быть более четкой. В нем указано «окончательное выражение Выражение, которое должно быть оценено ** в конце каждой итерации цикла **. Это происходит до следующей оценки условия. Обычно используется для обновления или увеличения переменной счетчика». –