Javascript简写三元运算子


102

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

startingNum = startingNum ? startingNum : 1

...如果适用,我们可以为三元运算符使用简写语法:

startingNum = startingNum ?: 1

而且我了解javascript中的三元运算符:

startingNum = startingNum ? startingNum : 1

...但是有速记吗?

Answers:


175
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

确实,今天早上一直在弹跳。已修复,但感谢您的注意。
布拉德·克里斯蒂

1
你不是要||代替??吗?
火箭Hazmat 2012年

2
谢谢!你钉了 我实际上在这种情况下使用一个对象。:)
Web_Designer 2012年

8
对于任何好奇的人,这都是有效的,因为JS的||运算符不会返回true或false,它会返回第一个“真实的”值。假设你有val0val1作为undefined,并且val22val33val0 || val1 || val2 || val3将返回2,因为它是第一个“真实”值。
杰克·T

2
这个习语不是反模式吗?如果传递0或空字符串该怎么办,“ OR”表达式将跳过它,并在您实际需要0或空字符串的地方使用默认值。
Paul Trzyna,


12

就在这里:

var startingNum = startingNum || 1;

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

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


if a is truthyvs 是不是更正确if a is evaluated to true
JaredPar '01

3
@JaredPar:为避免歧义,我将原来的详细解释替换为Mozilla Developer Network的解释。它应该减少歧义。
塔德克2012年

2
var startingNum = startingNum || 1;

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


2
startingNum = startingNum || 1

如果您的条件为空,例如

startingNum = startingNum ? startingNum : null

您可以使用 '&&'

startingNum = startingNum && startingNum

但是anything && null除非anything是虚假的,否则不会评估为null 吗?
Petruza

是的,如果有什么不对的话,它的值为空。如果错误,则评估为错误值
a2441918 '19

1

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

startingNum = startingNum ? otherNum : 1

可以表示为

startingNum = otherNum || 1

此处未涉及的另一种情况是,如果您希望该值在不匹配时返回false。JavaScript的简写为:

startingNum = startingNum ? otherNum : 0

但是它可以表示为

startingNum = startingNum && otherNum

只是想涵盖其他情况,以防其他人正在寻找更笼统的答案。


有没有这样的事情的简写:x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@Anthony不,因为innerWidth * 0.0375 > 24与的if true部分不同innerWidth * 0.0375。仅当expression to be evaluated和的if true值相同时,才可以使用简写形式。同样,为什么您无法速记x = someBoolean ? 'Heck yea!' : 'No way!'
deedub

@deedub好吧,实际上,有一个“速记”(如果您这样称呼),它将是Math.max(innerWidth * 0.0375, 24)
oldboy

@Anthony您不会这样称呼;)但是Math.max在您的用例中,它比三元运算符更好。
deedub '19

1
startingNum = startingNum ? otherNum : 1可以表示为startingNum = otherNum || 1”是错误的。我刚刚测试了这个
oldboy

0

使三元像:

boolean_condition ? true_result : false_result

在javascript中,您可以执行以下操作:

(boolean_condition && true_result ) || false_result;

例:

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

sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24会变成(innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? 有速记,所以我不必重复innerWidth * 0.0375,除了将其分配给变量???
oldboy

1
在这种情况下,Math.max( innerWidth * 0.0375 , 24 )可以正常工作。对于更一般的情况,最好创建一个称为“ somethingifiedInnerWidth”的描述性方法,该方法可以提高可读性,而不是创建变量。尽管在某些情况下,拥有一个(具有描述性名称的)变量会更容易理解,所以将来出现问题“为什么将它乘以这个?” 没有提出。
xxjjnn

哇甚至不知道你可以为...提供第二个论点Math.max。超级优雅的解决方案!!
老男孩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.