摘录1:
if ( x ) {
foo();
}
摘录2:
x ? foo() : 0;
这两个片段有什么区别?
修改:更正了语法错误。
更新:顺便说一下,似乎还有更短的符号:
x && foo();
答案 0 :(得分:8)
Snippet#2是一个无效的ECMAScript表达式,因为它缺少必需的: blah
以使其成为三元组。
编辑:两个片段之间没有什么区别,如果foo
是真的,他们都会调用x
。如果x
是假的(undefined / false / empty string / 0 /),那么第一个代码段将不会评估为任何内容,后一个代码段将评估为0
,但0
确实没有影响在剧本上。
答案 1 :(得分:3)
我认为您打算问以下
// Why should I use
if (x) {
do();
}
// instead of
x && do();
或
// Why should I use
if (x) {
do();
} else {
dont();
}
//instead of
x ? do() : dont()
在编写时,输出没有区别。我不喜欢使用三元或&&在这些情况下,运算符由于使用三元和&&的语义。三元组会返回您未使用的值,&&和&表达。因此,我宁愿使用语言打算使用运算符的方式。
然而,我喜欢使用&&用于空检查
var val = obj && obj.getValue();
请注意,在这种情况下,我们使用表达式的返回值
答案 2 :(得分:1)
通常,if
是一个语句(例如,您不能将它分配给变量),三元运算符?:
是表达式的一部分(产生一个可以赋给变量的值)
此外,if
块可以包含语句,而?:
的组件只能包含表达式。
在您给出的示例中,没有区别,因为您不使用?:
的结果。
只有当x是真值时,两个片段才会评估foo()
。