Как работают for
петли:
Сначала вам нужно понять, как работают for
петли.
Оператор for создает цикл, который состоит из трех необязательных выражений, заключенных в круглые скобки и разделенных точками с запятой, за которыми следует оператор (обычно оператор блока) для выполнения в цикле. MDN
Петля for
имеет такую структуру:
for ([initialization]; [condition]; [final-expression])
statement
Выражения initialization
, condition
иfinal-expression
может быть любым допустимым выражением.Любое или все эти выражения могут быть опущены (for(;;)
является допустимым в javascript и создает бесконечный цикл).
Цикл for
начинается с выполнения выражения initialization
, если указано, затем повторяетследующие действия: проверьте, верен ли condition
, если это так, то он выполняет statement
(s) и final-expression
по порядку, если condition
ложно, он прекращает цикл.
ВотНапример, следующая диаграмма ( источник изображения ) :
Соответствует следующему for
цикл:
for(i = 2; i <= 6; i = i + 2)
print i + 1
Обратите внимание, что initialization
часть i = 2
выполняется только один раз, тогда как остальные (часть condition
i <= 6
, часть statement
(s) и final-expression
i = i + 2
) может выполняться несколько раз (по порядку) в зависимости от condition
.
Объяснение рассматриваемого кода:
for (let node = list; node; node = node.rest) { // big question: how it works or possible?
arrays.push(node.value);
}
initialization
часть этого цикла просто объявляет переменную node
и устанавливает ее значение для корневого элемента list
, эта часть выполняется только один раз, когда lОоп собирается начать.
Часть condition
проверяет, является ли node
(переменная) истинным или нет, в javascript объект является истинным, тогда как undefined
- нет,это ложное значение (конечно, есть и другие истинные и ложные значения, но нас интересуют только эти два для этого конкретного примера).Концепция цикла заключается в том, чтобы перемещать объект от узла к узлу (см. final-expression
часть ниже).Когда дочерний узел существует, следующим значением node
будет этот узел (который является объектом), это означает, что это будет истинное значение, следовательно, условие будет истинным.Принимая во внимание, что если дочерний узел не существует, node
будет undefined
(ложное значение) и, следовательно, условие будет ложным.
final-expression
просто устанавливает значение node
вдочерний узел текущего узла, который является node.rest
.Если он существует, node
будет объектом, в противном случае это будет undefined
.