Каковы преимущества optional chaining в JavaScript?
Что проверяют
Знаете ли вы точную семантику оператора ?., а не только то, что он «защищает от ошибок». Следом обычно спрашивают, чем ?? отличается от ||, и когда optional chaining вредит.
Как отвечать
Optional chaining появился в ES2020: обращение к свойству выполняется, только если значение слева не null и не undefined, иначе выражение возвращает undefined без TypeError. Формы три: user?.profile, map?.[key] и вызов onClose?.(), который сработает, только если колбэк передан в пропсы.
Преимущества, которые стоит назвать:
- короткое замыкание всей цепочки: если
aравноnull, то вa?.b.c()не вычисляются ни.b, ни вызовc(); - только
nullиundefined: в отличие отa && a.b, значения0,''иfalseне обрывают выражение; - пара с
??:user?.name ?? 'Гость'подставит значение по умолчанию только для nullish, а||заменит и пустую строку, и ноль; - поддержка: все актуальные браузеры и Node.js с 2020 года, для старых целей оператор транспилируют TypeScript (с 3.7) и Babel.
Ограничения показывают уровень:
- нельзя присваивать:
a?.b = 1даётSyntaxError; - не спасает от необъявленной переменной:
notDeclared?.xброситReferenceError; ?.()проверяет только nullish: если там строка вместо функции, будетTypeError.
Где спотыкаются
Ставят ?. везде подряд. Если по контракту API поле обязано быть, молчаливый undefined прячет баг, и он всплывёт тремя экранами дальше. Лучше упасть рано или проверить ответ схемой, например через Zod.
Ошибаются с местом оператора: в a?.b.c защищён только a. Если может отсутствовать b, нужен a?.b?.c.
Комбинируют с || вместо ?? и получают баг: счётчик, равный 0, превращается в значение по умолчанию.