&&=、||= 和 ??= 有何用途?

eco*_*eer 13 javascript operators node.js

v15.0.1中看到过这种语法: &&=,||=??=。但我不知道它有什么作用。有人知道吗?

leo*_*ess 12

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

  1. 逻辑与赋值( &&=)
  2. 逻辑或赋值( ||=)
  3. 逻辑空赋值( ??=)

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

  1. x &&= y如果 x 不为真,则不执行任何操作;如果 x 为,则将 x 的值更改为 y 。它等同于:

    if (x) {
      x = y 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. x ||= y如果 x 为真,则不执行任何操作;如果 x不为真,则将 x 的值更改为 y 。它等同于:

    if (!x) {
      x = y 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. x ??= y如果 x 不为null ,则不执行任何操作;如果 x 为null,则将 x 的值更改为 y 。它等同于:

    if (x === null || x === undefined) {
      x = y 
    }
    
    Run Code Online (Sandbox Code Playgroud)

以下是一些示例,可帮助您加深对这些内容的理解:

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'
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 7

这些是新的逻辑赋值运算符。它们类似于更熟悉的运算符*=,如+=、 等。

someVar &&= someExpression大致相当于someVar = someVar && someExpression.

someVar ||= someExpression大致相当于someVar = someVar || someExpression.

someVar ??= someExpression大致相当于someVar = someVar ?? someExpression.

我说“大致”是因为有一个区别 - 如果不使用右侧的表达式,则不会调用可能的设置器。所以它更接近于:

someVar &&= someExpression就好像

if (!someVar) {
  someVar = someExpression;
}
Run Code Online (Sandbox Code Playgroud)

等等。(不调用 setter 的事实不太可能对脚本产生影响,但这并非不可能。)这与其他传统的简写赋值运算符不同,它们无条件分配给变量或属性(从而调用 setter) 。这是一个演示的片段:

if (!someVar) {
  someVar = someExpression;
}
Run Code Online (Sandbox Code Playgroud)

??,如果您不熟悉的话,它是空合并运算符。如果左侧是 或 ,它将计算null右侧undefined