Javascript简写三元运算符

Web*_*ner 89 javascript ternary-operator

我知道在php 5.3中,而不是使用这个冗余的三元运算符语法:

startingNum = startingNum ? startingNum : 1
Run Code Online (Sandbox Code Playgroud)

...我们可以在适用的情况下为我们的三元运算符使用简写语法:

startingNum = startingNum ?: 1
Run Code Online (Sandbox Code Playgroud)

我知道javascript中的三元运算符:

startingNum = startingNum ? startingNum : 1
Run Code Online (Sandbox Code Playgroud)

......但有速记吗?

多谢你们!

Bra*_*tie 149

var startingNumber = startingNumber || 1;
Run Code Online (Sandbox Code Playgroud)

你正在寻找什么,如果未定义它默认的地方?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这适用于很多场景,包括对象:

var foo = bar || {}; // secure an object is assigned when bar is absent
Run Code Online (Sandbox Code Playgroud)

  • 对于任何好奇的人来说,这是有效的,因为JS的`||'运算符不返回true或false,它返回第一个'truthy'值.假设你有`val0`和`val1`为`undefined`,`val2`为'2`,`val3`为`3`.`val0 || val1 || val2 || val3`将返回`2`,因为它是第一个'truthy'值. (6认同)
  • 谢谢!你钉了它.我实际上在这个例子中使用了一个对象.:) (2认同)
  • 这个习语不是反模式吗?如果您传递 0 或空字符串,'OR' 表达式将跳过它并在您实际需要 0 或空字符串的地方使用默认值。 (2认同)

Ada*_*kis 23

|| 将返回它遇到的第一个truthy值,因此可以用作合并运算符,类似于C#的 ??

startingNum = startingNum || 1;
Run Code Online (Sandbox Code Playgroud)


Jos*_*shu 18

添加 ES2020 后:

新的空合并:const difficulty = var?.nest[i]?.prop ?? false

较旧的操作:const difficulty = var.nest[i].prop ? var.nest[i].prop : false

属性之前的问号将首先检查该对象是否存在(如果您不确定它是否存在:就像 API 数据中一样),如果对象丢失,它将返回undefined

检查??左侧的值是否为nullor undefined,如果是,则返回右侧提供的值。


Tad*_*eck 11

就在这里:

var startingNum = startingNum || 1;
Run Code Online (Sandbox Code Playgroud)

通常,expr1 || expr2按以下方式工作(如文档中所述):

返回expr1是否可以转换为true; 否则,返回expr2.因此,当与Boolean值一起使用时,如果任一操作数为;则||返回; 如果两者都是,则返回.truetruefalsefalse

  • @JaredPar:为了避免含糊不清,我用Mozilla Developer Network中的一个替换了我原来的详细解释.它应该不那么模棱两可. (3认同)

use*_*882 8

在大多数现代浏览器中,您现在可以使用:

startingNum ??= 1;
Run Code Online (Sandbox Code Playgroud)

startingNum仅当它是null或 时才会改变undefined

请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment