在JavaScript中,使用
有什么区别true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"
和
true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"
答案 0 :(得分:6)
这是两个不同的概念,碰巧会为您提供相同的答案。
第一个示例使用ternary operator和,其结果仅取决于第一个操作数(在您的示例中是true
/ {{1} }):
false
它是true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"
/ if
的简写形式。如果第一个操作数为真,则返回第二个操作数(else
)。如果第一个操作数为假,则返回第三个操作数(Hello
)。
第一个示例的第一个表达式可以重写为:
Goodbye
第二个示例使用logical operators和,其结果取决于第一个和第二个操作数 。
if (true)
return 'Hello';
else
return 'Goodbye';
如果true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"
的值为真,则返回firstOperand && secondOperand
。如果他们认为错误,请返回secondOperand
(thirdOperand
)。
在您的示例中,由于非空字符串是真实的,因此Goodbye
的值为true && 'Hello'
,而Hello
的值为false && 'Hello'
。
第二个例子变成了:
false
由于||
的工作方式,这恰好输出了第一个示例输出的内容,但是它们是不同的概念。
请注意,在第一个示例中,我们如何知道在评估第一个操作数之后将返回什么。在第二个示例中,我们必须先评估前两个 操作数,然后才能知道返回什么。
答案 1 :(得分:2)
这是if else
的简称。
true ? 'Hello' : 'Goodbye'
等同于
if (true) {
'Hello'
} else {
'Goodbye'
}
true && 'Hello' || 'Goodbye'
不是if else
条件
true && 'Hello' || 'Goodbye'
等同于
(true && 'Hello') || 'Goodbye'
这将产生Hello
,但它基于优先级。考虑
'Goodbye' || (true && 'Hello')
这将导致Goodbye
。更改顺序会更改输出,但使用三元运算符不会发生。
答案 2 :(得分:1)
您的第一种情况是内联if语句的示例,而第二种情况是逻辑谓词的示例。
答案 3 :(得分:1)
似乎结果没有差异。但是我对它们是如何处理的有一个猜测。 ()?:
实际上比&&||
快一点(请参见下面的演示)。
(A)B?C:
基本上是IF速记,因此对(A)
部分进行了评估,并选择了B then
或C else
堆栈。
(A)&&B||C
被完全评估。首先(A)
得到评估。之后,implicit conversion(Boolean conversion)发生了-需要一些时间
var max = 1e7;
var start1 = (new Date()).getTime();
for( var i = 0; i < max; i++) {
let a = (i%2) ? max-i : max+1;
let b = (i%3) ? max-i : max+i;
}
var stop1 = (new Date()).getTime();
var start2 = (new Date()).getTime();
for( var i = 0; i < max; i++) {
let a = (i%2) && max-i || max+i;
let b = (i%3) && max-i || max+i;
}
var stop2 = (new Date()).getTime();
console.log( (new Date()).getTime() );
console.log( stop1 -start1 );
console.log( stop2 -start2 );