if .. else для выполняемых действий, а именно для получения значения ?? слева окажется null или undefined, то вернётся то, что справа. Иначе то, что слева.undefined ?? 'a' // "a"
null ?? 'b' // "b"
0 ?? 'c' // 0
false ?? 'd' // false
100 ?? 200 // 100 ?. и ??object?.property это почти то же, что и object.property, но если свойства property у объекта нет, это не вызовет ошибки, а просто вернёт undefined. Так можно в длинной цепочке свойств не проверять каждый шаг, а просто сразу всю цепочку записать, как я и сделал в ответе. console.trace() покажет цепочку из всех вызовов: const limit = 3;
function sendSomething(counter = 0) {
counter++;
// заряжаем паузу до следующей отправки
if (counter < limit) {
setTimeout(sendSomething, 0, counter);
} else {
console.log("Done", limit, counter);
console.trace();
}
}
sendSomething() // поехали!sendSomething debugger eval code:11
(Async: setTimeout handler)
sendSomething debugger eval code:8
(Async: setTimeout handler)
sendSomething debugger eval code:8
<anonymous> debugger eval code:15
` (наз. backtick) в JS строка текста может содержать и переносы строк и включать результат выполнения JS в теге ${ }await нельзя использовать в обычных функциях
Пользователь должен открыть JS-консоль?