Что выведет код Middle Современный синтаксис обновлено

Логическое присваивание и ленивое вычисление

Вопрос

Что выведет код? По строке на каждый вывод.

let calls = 0;
const make = () => { calls++; return 'новое'; };
const o = { a: 'есть', b: null, c: 0 };
o.a ||= make();
o.b ??= make();
o.c ||= make();
o.c &&= make();
console.log(o.a, o.b, o.c);
console.log(calls);

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: есть новое новое, 3. o.a истинно, поэтому = ничего не делает и make не вызывается. o.b равно null, ??= вызывает make (1). o.c равно 0, оно ложно, = вызывает make (2) и записывает 'новое'.

Что выведет

есть новое новое
3

Разбор

o.a истинно, поэтому ||= ничего не делает и make не вызывается. o.b равно null, ??= вызывает make (1). o.c равно 0, оно ложно, ||= вызывает make (2) и записывает 'новое'. Теперь o.c истинно, и &&= снова вызывает make (3). Итого три вызова.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме