逻辑赋值运算符提议(https://github.com/tc39/proposal-logical-assignment)引入以下复合赋值运算符:
a ||= ba &&= ba ??= b
现有复合赋值运算符
JavaScript已经有以下复合赋值运算符:
- 算术赋值运算符:
+= -= *= /= %= **=
- 按位分配运算符:
&= ^= |=
- 按位移位分配运算符:
<<= >>= >>>=
在我们研究所提出的算符之前,我们必须先绕一小段路,学习之前的"短路"
逻辑运算符| |,&&??所有运算符仅当第一个操作数尚未确定结果时,才计算第二个操作数:
提议的运算符
逻辑赋值运算符的工作方式与其他复合赋值运算符不同:
为什么a | |=b等价于下面的表达式?
a | |(a=b)
为什么不是这样呢?
a=a | | b
前一个表达式具有短路的优点:只有当a的计算结果为false时,才会计算赋值。因此,只有在必要时才执行赋值。相反,后一个表达式总是执行赋值。
示例:使用??=添加缺少的属性
const books = [ { isbn: '123', }, { title: 'ECMAScript Language Specification', isbn: '456', },];// Add property .title where it’s missingfor (const book of books) { book.title ??= '(Untitled)';}assert.deepEqual( books, [ { isbn: '123', title: '(Untitled)', }, { title: 'ECMAScript Language Specification', isbn: '456', }, ]);
示例:分解表达式
考虑以下函数,该函数返回跨多行展开的表达式:
function canContainNumber(value) { return typeof value === 'number' || typeof value === 'bigint' || typeof value === 'string' ;}assert.equal(canContainNumber(''), true);assert.equal(canContainNumber(Symbol()), false);
此表达式可以按如下方式分解:
function canContainNumber(value) { let result = false; result ||= typeof value === 'number'; result ||= typeof value === 'bigint'; result ||= typeof value === 'string'; return result;}