TypeScript
October 29, 2024

??= ||= &&= WTF?

Ок, с ходу - три новых оператора в JS, которые проскочили мимо большинства. С виду просто «какая-то ерунда», но не тут-то было! Давайте разберёмся.

??= — Нулевое присваивание

Начнём с того, что этот оператор работает (если честно так и подмывало тут и закончить предложение) только, если переменная null или undefined. Это как сказать: «Если ничего не задано, тогда бери вот это». Пример:

let foo;
foo ??= 42;
console.log(foo); // 42 — подхватил значение, потому что foo был undefined

foo ??= 100;
console.log(foo); // 42 — остался, ведь foo уже не null и не undefined

В ECMAScript под капотом называет это Nullish Coalescing Assignment — логика такая: проверяет, пусто ли (null/undefined), если да, — присваивает, если нет, — пропускает. Эдакий мини-страж от ошибок, когда значение по умолчанию нужно только при «пустоте».

||= Логическое присваивание через OR

А вот этот оператор нужен, когда надо присвоить значение, если переменная — falsy (то есть false, 0, '', null, undefined или NaN). Представь: проверка на пустые строки или ноль и дефолтное значение при этом. Кайф:

let y = '';
y ||= 'Привет';
console.log(y); // "Привет", потому что y был пустой строкой

let z = 'Я тут';
z ||= 'Пока';
console.log(z); // "Я тут", потому что z уже правдиво

Это называется Logical OR Assignment. Логика простая — если переменная «ложна», то она обновляется. Если правдива — то остаётся как есть. Меньше `if`, меньше кода, больше читаемости.

&&= — Логическое присваивание через AND

А вот тут всё наоборот: присваивание происходит только если переменная truthy. Представь: «если правда, то продолжай». Чёткий инструмент для ситуации, когда обновляем только работающие переменные.

let alpha = 5;
alpha &&= 10;
console.log(alpha); // 10 — обновил, потому что alpha был 5

let beta = 0;
beta &&= 10;
console.log(beta); // 0 — остался как был, ведь beta был falsy

По спецификации это Logical AND Assignment. Если переменная правдива, оператор присвоит новое значение, иначе — нет.

На самом деле тут применений я вижу меньше, чем у первых 2х, их то я точно буду использовать, а этот.. хзхз!

Итого, у нас есть три инструмента, которые решают частую головную боль по работе с дефолтами и проверками. Да, не без подводных камней, но эти операторы чистят код, делая его понятнее.

PS: там есть всякое, типа >>= и <<<= но камон, когда ты последний раз использовал сдвиг влево? Ай не п**ди, не использовал ты его.

PPS: Если твой лид говорит тебе, что такое нельзя использовать в проде потому "ну там же эдж, там же сафары" - тыкни носом его в зеленые циферки

Ну и еще, вот ссылка на tc39 - ты знаешь что делать (забить болт).