链判断运算符 ?.
- 读取对象内部的某个属性,往往需要判断一下,属性的上层对象是否存在。使用
链判断运算符,如果左侧为null或undefined就不再往下运算,返回undefined。
const firstName = (message
&& message.body
&& message.body.user
&& message.body.user.firstName) || 'default';
const firstName = message?.body?.user?.firstName || 'default';
iterator.return?.()
Null判断运算符 ??
- 读取对象属性的时候,如果某个属性的值是
null或undefined,有时候需要为它们指定默认值。使用Null判断运算符,当左侧为null或undefined时,才会返回右侧的值。
let a = {};
a.b ?? 1
a ?? 2
let a = {b: {}};
a?.b?.c ?? 1
a?.b ?? 1
逻辑赋值运算符 ||= &&= ??=
- 这三个运算符相当于先进行逻辑运算,然后根据运算结果,再视情况进行赋值运算。
x ||= y
x || (x = y)
x &&= y
x && (x = y)
x ??= y
x ?? (x = y)
user.id = user.id || 1;
user.id ||= 1;
function example(opts) {
opts.foo = opts.foo || 'bar';
opts.baz = opts.baz || 'qux';
}
function example(opts) {
opts.foo ??= 'bar';
opts.baz ??= 'qux';
}