&&=、||= 和 ??= 的作用是什么?

What purpose do &&=, ||= and ??= serve?

我在 v15.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 边是 nullundefined.

,它将计算到 right-hand 边

这些被称为逻辑赋值运算符,总共有三个:

  1. Logical AND assignment (&&=)
  2. Logical OR assignment (||=)
  3. Logical nullish assignment (??=)

从根本上说,它们都做同样的事情:= 前面的逻辑运算符 &&??|| 可以是 x logical-operator= y重写为 x logical-operator (x = y)。它们的唯一目的是替换更冗长的代码:

  1. x &&= y returns x 当 x 是 不真实时 和 returns y 当 x 是 真实。等同于:

    if (x) {
      x = y 
    }
    
  2. x ||= y returns x 当 x 是 truthy 和 returns y 当 x 是 不真实。等同于:

    if (!x) {
      x = y 
    }
    
  3. 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 只是 nullundefined, 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

不懂的再看一遍!