javascript &&=做什么用途,||=和??=发球?

lfapxunr  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(128)

我在node.js v15.0.1中见过以下语法:&&=||=??=。但是我不知道它是做什么的。有人知道吗?

mnemlml8

mnemlml81#

这些是新的logical assignment operators,它们类似于我们更熟悉的运算符,如*=+=等。
someVar &&= someExpression大致等于someVar = someVar && someExpression
someVar ||= someExpression大致等于someVar = someVar || someExpression
someVar ??= someExpression大致等于someVar = someVar ?? someExpression
我说“粗略地”是因为有一个区别--如果没有使用右边的表达式,可能的setter就不会被调用,所以它更接近于:
就像

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,它将计算右边的值。

e5njpo68

e5njpo682#

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

  1. Logical AND assignment&&=
  2. Logical OR assignment||=
  3. Logical nullish assignment??=
    从根本上说,它们都是这样做的:x logical-operator= y=前面的逻辑运算符&&??||可以重写为x logical-operator (x = y),它们的唯一目的是替换更冗长的代码:
  4. x &&= y在x为 not truthy 时不执行任何操作,在x为 truthy 时将x的值更改为y。
if (x) {
  x = y 
}
  1. x ||= y在x为 truthy 时不执行任何操作,在x为 not truthy 时将x的值更改为y。
if (!x) {
  x = y 
}
  1. x ??= y在x为 not nullish 时不执行任何操作,在x为 nullish 时将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'
c3frrgcw

c3frrgcw3#

a = a || b等价于a ||= b =〉如果a为真,则a返回,但是如果a为假,则b返回。
a = a && b等价于a &&= b =〉如果a为真,则b返回,但是如果a为假,则a返回。
a = a ?? b等价于a ??= b =〉如果a正好是nullundefined,则b返回,但是如果a为真,则a返回。
注意:nullundefined""0NaN为假
示例:

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

如果你不明白,再读一遍!

相关问题