Node.js 你的目的是什么&;=,| |=那么???=发球?

Node.js 你的目的是什么&;=,| |=那么???=发球?,node.js,javascript,operators,Node.js,Javascript,Operators,我在v15.0.1中看到过这种语法:&&=,|124;=和??=。 但我不知道它有什么作用。有人知道吗?这些是新的。它们类似于更熟悉的操作符,如*=,+=,等等 someVar&&someExpression大致相当于someVar=someVar&&someExpression someVar | |=someExpression大致相当于someVar=someVar | | someExpression someVar???=someExpression大致相当于someVar=someV

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

这些是新的。它们类似于更熟悉的操作符,如
*=
+=
,等等

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

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

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

我之所以说“粗略”,是因为有一个区别——如果不使用右侧的表达式,则不会调用可能的setter。所以它有点接近:

someVar&&=someExpression
类似于

if (!someVar) {
  someVar = someExpression;
}
等等。(不调用setter的事实是会对脚本产生影响,但这并非不可能。)这与其他传统的速记赋值运算符不同,后者会无条件地赋值给变量或属性(从而调用setter)。下面是一个要演示的片段:

const obj={
_道具:1,,
设置道具(newVal){
这个._prop=newVal;
},
获取道具(){
把这个还给我;
}
};
//无法调用Setter:

obj.prop | |=5这些被称为逻辑赋值运算符,总共有三个:

  • &&
  • | |=
  • ??=
  • 基本上,它们都是一样的:在
    =
    前面的逻辑运算符
    &&
    ??
    |
    可以重写为
    x逻辑运算符(x=y)
    。它们的唯一目的是替换更详细的代码:

  • x&&=y
    当x不真实时返回x,当x真实时返回y。这与:

    if (x) {
      x = y 
    }
    
    if (!x) {
      x = y 
    }
    
    if (x === null || x === undefined) {
      x = y 
    }
    
  • x | |=y
    当x为真时返回x,当x为非真时返回y。这与:

    if (x) {
      x = y 
    }
    
    if (!x) {
      x = y 
    }
    
    if (x === null || x === undefined) {
      x = y 
    }
    
  • x???=y
    当x不为空时返回x,当x为空时返回y。这与:

    if (x) {
      x = y 
    }
    
    if (!x) {
      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'
    

    Mozilla建议&&=与您提出的简化方法略有不同,但差别不大。不幸的是,当前接受的答案包含一些不正确的信息。可能是因为逻辑赋值运算符当时还处于早期阶段,所以实现发生了变化。@leonheess我查看了它,但没有发现任何错误,您能指出什么是错误的吗?Thanks@CertainPerformance将我的答案中的等效部分或与您的“等效代码”进行比较。