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

我在中看到过这个语法节点.jsv15.0.1:&&=||=??=。但我不知道它有什么作用。有人知道吗?



牧羊人nacy
浏览 147回答 3
3回答

心有法竹

这些称为逻辑赋值运算符,总共有 3 个:逻辑与赋值( &&=)逻辑或赋值( ||=)逻辑空赋值( ??=)从根本上来说,它们的作用都是相同的:as前面的逻辑运算符&&,??和可以重写为。它们的唯一目的是替换更冗长的代码:||=x logical-operator= yx logical-operator (x = y)x &&= y如果 x不为真,则不执行任何操作;如果 x 为真,则将 x 的值更改为 y 。它等同于:if (x) {   x = y  }x ||= y如果 x 为真,则不执行任何操作;如果 x不为真,则将 x 的值更改为 y 。它等同于:if (!x) {   x = y  }x ??= y如果 x 不为null ,则不执行任何操作;如果 x 为null,则将 x 的值更改为 y 。它等同于:if (x === null || x === undefined) {   x = y  }以下是一些示例,可帮助您加深对这些内容的理解:const y = 'other value'let def   = 'initial'    // truthy valuelet zero  = 0            // not truth valuelet undef = undefined    // nullish valuedef   &&= y    // def = 'other value'zero  &&= y    // zero = 0undef &&= y    // undef = 'undefined'def   ||= y    // def = 'initial'zero  ||= y    // zero = 'other value'undef ||= y    // undef = 'other value'def   ??= y    // def = 'initial'zero  ??= y    // zero = 0undef ??= y    // undef = 'other value'

BIG阳

这些是新的逻辑赋值运算符。它们类似于更熟悉的运算符*=,如+=、 等。someVar &&= someExpression大致相当于someVar = someVar && someExpression.someVar ||= someExpression大致相当于someVar = someVar || someExpression.someVar ??= someExpression大致相当于someVar = someVar ?? someExpression.我说“大致”是因为有一个区别 - 如果不使用右侧的表达式,则不会调用可能的设置器。所以它更接近于:someVar &&= someExpression就好像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。

RISEBY

a = a || b相当于a ||= b=> 如果a为 true,a则返回,但如果a为 false,b则返回。a = a && b相当于a &&= b=> 如果a为 true,b则返回,但如果a为 false,a则返回。a = a ?? b相当于a ??= b=> 如果a只是 is nullor undefined,b则返回,但如果a是 truea返回。注:null、undefined、""、0、NaN均为 false例子:let a = -22const b = falsea &&= bconsole.log(a)   // falselet a = 0const b = 'hello'a ||= bconsole.log(a)   // hellolet a = falselet b = truea ??= bconsole.log(a)   // falselet a = nulllet b = truea ??= bconsole.log(a)   // true如果你不明白,请再读一遍!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript