&&=、||= 和 ??= 的作用是什么?
What purpose do &&=, ||= and ??= serve?
我在 node.jsv15.0.1 中看到过这种语法:&&=
、||=
和 ??=
。
但我不知道它有什么作用。有人知道吗?
这些是新的 logical assignment operators。它们类似于更熟悉的运算符,如 *=
、+=
等
someVar &&= someExpression
大致相当于 someVar = someVar && someExpression
.
someVar ||= someExpression
大致相当于 someVar = someVar || someExpression
.
someVar ??= someExpression
大致相当于 someVar = someVar ?? someExpression
.
我说“大致”是因为有一个区别——如果 right-hand 侧的表达式没有被使用,可能的 setter 不会被调用。所以它更接近于:
someVar &&= someExpression
就像
if (!someVar) {
someVar = someExpression;
}
等等。 (setter 未被调用的事实是 unlikely 对脚本产生影响,但这并非不可能。)这不同于其他传统的 shorthand 赋值运算符 do 无条件赋值给变量或 属性(从而调用 setters)。这里有一个片段来演示:
const obj = {
_prop: 1,
set prop(newVal) {
this._prop = newVal;
},
get prop() {
return this._prop;
}
};
// Setter does not get invoked:
obj.prop ||= 5;
??
,如果您不熟悉它,它是无效合并运算符。如果 left-hand 边是 null
或 undefined
.
,它将计算到 right-hand 边
这些被称为逻辑赋值运算符,总共有三个:
- Logical AND assignment (
&&=
)
- Logical OR assignment (
||=
)
- Logical nullish assignment (
??=
)
从根本上说,它们都做同样的事情:=
前面的逻辑运算符 &&
、??
和 ||
可以是 x logical-operator= y
重写为 x logical-operator (x = y)
。它们的唯一目的是替换更冗长的代码:
x &&= y
returns x 当 x 是 不真实时 和 returns y 当 x 是 真实。等同于:
if (x) {
x = y
}
x ||= y
returns x 当 x 是 truthy 和 returns y 当 x 是 不真实。等同于:
if (!x) {
x = y
}
x ??= y
returns x 当 x 是 不为零时 和 returns y 当 x 是 无效。等同于:
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'
a = a || b
等同于 a ||= b
=> 如果 a
为真,a
return 但如果 a
为假 b
return.
a = a && b
等同于 a &&= b
=> 如果 a
为真,b
return 但如果 a
为假 a
return.
a = a ?? b
等价于 a ??= b
=> 如果 a
只是 null
或 undefined
, b
return但如果 a
为真 a
return.
note: null
, undefined
, ""
, 0
, NaN
are 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
不懂的再看一遍!
我在 node.jsv15.0.1 中看到过这种语法:&&=
、||=
和 ??=
。
但我不知道它有什么作用。有人知道吗?
这些是新的 logical assignment operators。它们类似于更熟悉的运算符,如 *=
、+=
等
someVar &&= someExpression
大致相当于 someVar = someVar && someExpression
.
someVar ||= someExpression
大致相当于 someVar = someVar || someExpression
.
someVar ??= someExpression
大致相当于 someVar = someVar ?? someExpression
.
我说“大致”是因为有一个区别——如果 right-hand 侧的表达式没有被使用,可能的 setter 不会被调用。所以它更接近于:
someVar &&= someExpression
就像
if (!someVar) {
someVar = someExpression;
}
等等。 (setter 未被调用的事实是 unlikely 对脚本产生影响,但这并非不可能。)这不同于其他传统的 shorthand 赋值运算符 do 无条件赋值给变量或 属性(从而调用 setters)。这里有一个片段来演示:
const obj = {
_prop: 1,
set prop(newVal) {
this._prop = newVal;
},
get prop() {
return this._prop;
}
};
// Setter does not get invoked:
obj.prop ||= 5;
??
,如果您不熟悉它,它是无效合并运算符。如果 left-hand 边是 null
或 undefined
.
这些被称为逻辑赋值运算符,总共有三个:
- Logical AND assignment (
&&=
) - Logical OR assignment (
||=
) - Logical nullish assignment (
??=
)
从根本上说,它们都做同样的事情:=
前面的逻辑运算符 &&
、??
和 ||
可以是 x logical-operator= y
重写为 x logical-operator (x = y)
。它们的唯一目的是替换更冗长的代码:
x &&= y
returns x 当 x 是 不真实时 和 returns y 当 x 是 真实。等同于:if (x) { x = y }
x ||= y
returns x 当 x 是 truthy 和 returns y 当 x 是 不真实。等同于:if (!x) { x = y }
x ??= y
returns x 当 x 是 不为零时 和 returns y 当 x 是 无效。等同于: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'
a = a || b
等同于 a ||= b
=> 如果 a
为真,a
return 但如果 a
为假 b
return.
a = a && b
等同于 a &&= b
=> 如果 a
为真,b
return 但如果 a
为假 a
return.
a = a ?? b
等价于 a ??= b
=> 如果 a
只是 null
或 undefined
, b
return但如果 a
为真 a
return.
note:
null
,undefined
,""
,0
,NaN
are 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
不懂的再看一遍!