3 回答
TA贡献1866条经验 获得超5个赞
这些称为逻辑赋值运算符,总共有 3 个:
逻辑与赋值(
&&=
)逻辑或赋值(
||=
)逻辑空赋值(
??=
)
从根本上来说,它们的作用都是相同的:as前面的逻辑运算符&&
,??
和可以重写为。它们的唯一目的是替换更冗长的代码:||
=
x logical-operator= y
x logical-operator (x = y)
x &&= y
如果 x不为真,则不执行任何操作;如果 x 为真,则将 x 的值更改为 y 。它等同于:if (x) { x = y }
x ||= y
如果 x 为真,则不执行任何操作;如果 x不为真,则将 x 的值更改为 y 。它等同于:if (!x) { x = y }
x ??= y
如果 x 不为null ,则不执行任何操作;如果 x 为null,则将 x 的值更改为 y 。它等同于:if (x === null || x === undefined) { x = y }
以下是一些示例,可帮助您加深对这些内容的理解:
const y = 'other value'
let def = 'initial' // truthy value
let zero = 0 // not truth value
let undef = undefined // nullish value
def &&= y // def = 'other value'
zero &&= y // zero = 0
undef &&= y // undef = 'undefined'
def ||= y // def = 'initial'
zero ||= y // zero = 'other value'
undef ||= y // undef = 'other value'
def ??= y // def = 'initial'
zero ??= y // zero = 0
undef ??= y // undef = 'other value'
TA贡献1859条经验 获得超6个赞
这些是新的逻辑赋值运算符。它们类似于更熟悉的运算符*=
,如+=
、 等。
someVar &&= someExpression
大致相当于someVar = someVar && someExpression
.
someVar ||= someExpression
大致相当于someVar = someVar || someExpression
.
someVar ??= someExpression
大致相当于someVar = someVar ?? someExpression
.
我说“大致”是因为有一个区别 - 如果不使用右侧的表达式,则不会调用可能的设置器。所以它更接近于:
someVar &&= someExpression
就好像
if (!someVar) { someVar = someExpression; }
等等。(不调用 setter 的事实不太可能对脚本产生影响,但这并非不可能。)这与其他传统的简写赋值运算符不同,它们无条件分配给变量或属性(从而调用 setter) 。这是一个演示的片段:
const obj = {
_prop: 1,
set prop(newVal) {
this._prop = newVal;
},
get prop() {
return this._prop;
}
};
// Setter does not get invoked:
obj.prop ||= 5;
??
,如果您不熟悉的话,它是空合并运算符。如果左侧是 或 ,它将计算null
右侧undefined
。
TA贡献1856条经验 获得超5个赞
a = a || b
相当于a ||= b
=> 如果a
为 true,a
则返回,但如果a
为 false,b
则返回。
a = a && b
相当于a &&= b
=> 如果a
为 true,b
则返回,但如果a
为 false,a
则返回。
a = a ?? b
相当于a ??= b
=> 如果a
只是 is null
or undefined
,b
则返回,但如果a
是 truea
返回。
注:
null
、undefined
、""
、0
、NaN
均为 false
例子:
let a = -22
const b = false
a &&= b
console.log(a) // false
let a = 0
const b = 'hello'
a ||= b
console.log(a) // hello
let a = false
let b = true
a ??= b
console.log(a) // false
let a = null
let b = true
a ??= b
console.log(a) // true
如果你不明白,请再读一遍!
添加回答
举报