JavaScript速记三值运算符

JavaScript速记三值运算符,javascript,conditional-operator,Javascript,Conditional Operator,我知道在PHP 5.3中,不使用这种冗余的三元运算符语法: startingNum = startingNum ? startingNum : 1 …在适用的情况下,我们可以使用三元运算符的速记语法: startingNum = startingNum ?: 1 我知道JavaScript中的三元运算符: startingNum = startingNum ? startingNum : 1 …但是有速记吗 var startingNumber = startingNumber || 1;

我知道在PHP 5.3中,不使用这种冗余的三元运算符语法:

startingNum = startingNum ? startingNum : 1
…在适用的情况下,我们可以使用三元运算符的速记语法:

startingNum = startingNum ?: 1
我知道JavaScript中的三元运算符:

startingNum = startingNum ? startingNum : 1
…但是有速记吗

var startingNumber = startingNumber || 1;
像这样的东西你在寻找什么,如果没有定义它会默认吗

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2
顺便说一下,这适用于很多场景,包括对象:

var foo = bar || {}; // secure an object is assigned when bar is absent

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

startingNum = startingNum || 1;
是的,有:

var startingNum = startingNum || 1;
通常,
expr1 | | expr2
的工作方式如下(如所述):

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


在这种情况下,您可以使用OR运算符。

以上答案是正确的。在JavaScript中,以下语句:

startingNum = startingNum ? otherNum : 1
可以表示为

startingNum = otherNum || 1
startingNum = startingNum && otherNum
这里未涉及的另一种情况是,如果希望值在不匹配时返回false。JavaScript的简写是:

startingNum = startingNum ? otherNum : 0
但它可以表示为

startingNum = otherNum || 1
startingNum = startingNum && otherNum
只是想涵盖另一种情况,以防其他人正在寻找更普遍的答案

startingNum = startingNum || 1
如果你有一个空的条件,比如

startingNum = startingNum ? startingNum : null
您可以使用“&&”

startingNum = startingNum && startingNum

要使三元结构类似于:

boolean_condition ? true_result : false_result
在javascript中,您可以执行以下操作:

(boolean_condition && true_result ) || false_result;
例如:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

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

startingNum ??= 1;
只有在
null
未定义的情况下,才会更改
startingNum


参见:

添加ES2020:

Neww/Nullish合并:
const难度=var?.nest[i]?.prop??错误

较旧的操作:
const-demobility=var.nest[i].prop?var.nest[i].属性:false

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



??
检查左侧的值是否为
null
未定义
,如果是,将在右侧返回提供的值。

如果a为真,那么说
是否比如果a为真的
更正确,我已经用Mozilla开发者网络的详细解释替换了我原来的详细解释。它应该不那么模棱两可。谢谢!你搞定了。我实际上在这个实例中使用了一个对象。:)对于任何好奇的人来说,这是可行的,因为JS的
|
操作符不返回true或false,而是返回第一个“truthy”值。假设您有
val0
val1
作为
未定义的
val2
2
val3
3
val0 | | | val1 | val2 | | val3
将返回
2
,因为它是第一个“truthy”值。这个习惯用法不是反模式吗?如果传递0或空字符串,则“或”表达式将跳过它,并在实际需要0或空字符串的位置使用默认值。@Paul确实,这是一个合并操作,但模拟了OP请求的操作。这个行为和OP的例子没有什么不同。这些注释也可以添加到答案中,用于一些关于所谓的“合并操作”及其工作原理的上下文:)我更喜欢你的解释,比如有这样的缩写:
x=innerWidth*0.0375>24?innerWidth*0.0375:24
?@Anthony否,因为
innerWidth*0.0375>24
if true
部分不同,后者是
innerWidth*0.0375
。仅当要计算的
表达式
if true
的值相同时,才能使用速记。这就是为什么你不能速记
x=someBoolean?”“是的!”不可能
@deedub事实上,有一个“速记”(如果你这样称呼的话)就是
Math.max(innerWidth*0.0375,24)
@Anthony你不会这么称呼它;)但是在您的用例中,
Math.max
比三元运算符工作得更好。“
startingNum=startingNum?otherNum:1
可以表示为
startingNum=otherNum | | 1
”是错误的。我刚刚测试过这个,所以
x=innerWidth*0.0375>24?innerWidth*0.0375:24
将变成
(innerWidth*0.0375>24和&innerWidth*0.0375)| 24
??是否有一个速记,这样我就不必重复
innerWidth*0.0375
,而只需将它赋给一个变量???在这种情况下,
Math.max(innerWidth*0.0375,24)
将非常有效。对于更一般的情况,最好创建一个名为“somethingfiedinerwidth”的描述性方法,以提高可读性,而不是创建一个变量。虽然在某些情况下,有一个变量(这个描述性名称)会更具可读性,所以在将来不会提出“为什么它要乘以这个?”的问题。哇,我甚至不知道你可以为
Math.max
提供第二个参数。超级优雅的解决方案!!但是
anything&&null
不会计算为null吗,除非
anything
是假的?是的,如果任何东西是真的,它会计算为null。如果为falsy,则计算为falsy值