JavaScript支持类似于PHP中的短三元运算符吗?

27

我喜欢PHP的"短三元运算符",即省略第二个表达式的写法:

// PHP

$foo = 'hello';
$bar = '';

echo $foo ?: 'world'; // hello
echo $bar ?: 'world'; // world

Javascript支持类似这样的语法吗?我尝试使用?:结果出现了语法错误。我知道布尔值短路,但对于我目前正在做的事情来说并不可行,那就是:

// Javascript

var data = {
    key: value ?: 'default'
};

有什么建议吗?(我可以将其包装在立即调用的匿名函数中,但那似乎很傻)


@NullUserException - 我正在使用jQuery,虽然我确实缓存了我的选择,但非默认值是通过调用.data()得到的结果,我只是想避免使用建议的语法进行第二次调用(并避免将该值存储在临时变量中)。 - Dan Lugg
3个回答

49
var data = {
    key: value || 'default'
};

不错!谢谢@SomeGuy - 不过这似乎非常奇怪,因为Javascript(读作,任何语言)会从这样的比较中返回一个非布尔值。我的意思是,我知道它是松散类型的,但天哪。 - Dan Lugg
如果你只是想允许默认值,$.extend 是一个非常有用的函数。 - zzzzBov
1
@Bracketworks:在许多(尤其是函数式)语言中,布尔运算符不会返回布尔值。它们只会返回运算符的一侧(或“false”)。 - NikiC
1
@NikiC - 谢谢,我不知道这个;除了JavaScript之外,还有什么其他的例子吗?我只是好奇。 - Dan Lugg
3
Python和Lisp是我想到的语言。虽然可能还有很多其他语言,但我不太了解 ;) - NikiC
5
请记住,这种方法并不总是按预期工作。例如,如果 value = 0,那么 data.key 将计算为 'default'。如果 0data.key 的有效值,那么这可能不是您想要的结果。 - Wil Moore III

16

是的,使用||。与PHP不同,JavaScript的||操作符将返回第一个非falsy值,而不是标准化的布尔值。

foo || 'world'

谢谢@jimbojw - 不过SomeGuy已经赶上你了 :) - Dan Lugg
3
好的,那就是我解释而不是只写答案的代价。 - jimbo
是的,我已经编辑掉了 - 同意那很糟糕。 - jimbo
比被接受的答案更好的解释;谢谢。 - Autumn Leonard

0
var myFunc = function(foo) {
  foo = foo || 'my default value for foo';
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接