Операторы логического присваивания
Перевод: Aaron Goldsmith — Logical Assignment Operators
Javascript (ES2021) теперь поддерживает возможность комбинировать логические операции и операцию присваивания с помощью новых операторов &&=, ||= и ??=. Ранее составные операторы присваивания были возможны только с математическими и побитовыми операциями.
Логическое И присваивание &&=
Оператор логического И (AND) присваивания x &&= y выполняет присваивание, только если x истинно. Например:
let a = 1; let b = 0; a &&= 2; console.log(a); // output: 2 b &&= 2; console.log(b); // output: 0
Если левое выражение является ложным, то правое выражение не оценивается, поэтому значение b не переопределено, так как 0 является ложным.
a &&= 2 эквивалентно a && (a = 2), значение a переназначено, потому что оно изначально было истинным.
Логическое ИЛИ присваивание ||=
Оператор логического ИЛИ (OR) x ||= y присваивает, только если x является ложным.
const a = 50; const b = ''; a ||= 10; console.log(a); // output: 50 b ||= 'string is empty.'; console.log(b); // output: "string is empty."
В приведенном выше примере a ||= 10 эквивалентно a || (a = 10), но поскольку значение a истинно, то правое значение не будет присвоено левому оператору
Если вы делаете проверку на ложное значение, таких типов данных как пустая строка или 0, необходимо использовать ||=, в противном случае для проверки значений null или undefined
следует использовать логический оператор ?? =.
Логическое нулевое присвоение ??=
Оператор логического нулевого присваивания x ?? = y назначает, только если x имеет значение null или undefined.
const a = { limt: 50 }; a.limit ??= 10; console.log(a.limit); // output: 50 a.speed ??= 25; console.log(a.speed); // output: 25
Логическое нулевое выражение переназначает левое выражение, если левая часть является null
, или undefined.
В приведенном выше примере переназначение a.limit не выполняется, потому что его значение определено как 50, что не является null
или undefined.
Но a.speed первоначально будет иметь значение undefined, поэтому оценивается правое выражение, которое эквивалентно a.speed = 25, то есть конечный результат будет a = {limit: 50, speed: 25}.
Интересное присвоение, когда переменная является константой…