if (x) { foo(); } 和 x ? foo() : 0; 的区别是什么?

4

代码片段1:

if ( x ) { 
    foo();
}

代码片段 2:

x ? foo() : 0;  

这两个片段有什么区别?
编辑:已更正语法错误。
更新:顺便提一下,似乎还有一种更短的符号表示方法:
x && foo();
3个回答

8

片段 #2 是一个无效的 ECMAScript 表达式,因为它缺少必需的 : blah 以使其成为三元表达式。

编辑:这两个片段实际上没有区别,它们都会在 x 为真值时调用 foo。如果 x 为假值(未定义/假/空字符串/0),那么第一个片段不会评估任何东西,而后者将评估为 0,但是该 0 对脚本没有任何影响。


此外,块语法不会计算出任何值(它不是一个表达式)。而三元操作符会计算出一个值。 - cdhowie
如果我们有 x ? foo() : bar(),并且这些函数没有返回任何值。它是否符合ECMA标准,因为它实际上的值是undefined - Martin Algesten
@Martin:是的。表达式可以用作语句。任何函数都可以返回undefined而不会出错。只有在尝试使用值undefined时才会崩溃。 - cdhowie
@meder 好的,我搞明白了。谢谢。 (我以为这两者之间可能有些微小的区别,但我想没有。) - Šime Vidas
好的,它按预期工作,但我是否可以理解答案为“是的,那是好的ECMA脚本”? - Martin Algesten
显示剩余2条评论

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();

请注意,这种情况下我们使用表达式的返回值。

1
+1 我喜欢这个技巧:x && foo(); 而不是 if (x) { foo(); }。我会记住的。 :) - Šime Vidas
当然可以...尽管那是我的反建议。我曾经使用过它,但被其他开发人员说服不要这样做。 - Ruan Mendes

1
通常,if是一个语句(例如,您不能将其分配给变量),而三元运算符?:是表达式的一部分(产生可以分配给变量的值)。
此外,if块可以包含语句,而?:的组件只能包含表达式。
在您提供的示例中,没有区别,因为您不使用?:的结果。两个片段仅在x为真值时评估foo()

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