![](/img/trans.png)
[英]What is the exact difference between the ternary operator and && operator?
[英]What is the difference between using '&&' and '||' over a ternary operator ('?' and ':')?
在 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"
这是两个不同的概念,碰巧给了你相同的答案。
第一个示例使用三元运算符,其结果仅取决于第一个操作数(在您的示例中为true
/ false
):
true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"
它是if
/ else
的简写形式。 如果第一个操作数为真,则返回第二个操作数 ( Hello
)。 如果第一个操作数为假,则返回第三个操作数 ( Goodbye
)。
第一个示例的第一个表达式可以重写为:
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
。
所以你的第二个例子变成了:
'Hello' || 'Goodbye'
false || 'Goodbye'
因为如何||
有效,这恰好输出了您的第一个示例输出的内容,但它们是不同的概念。
注意在第一个例子中,我们知道在评估第一个操作数后要返回什么。 在第二个示例中,我们必须先评估前两个操作数,然后才能知道要返回什么。
这是if else
的简写。
true ? 'Hello' : 'Goodbye'
相当于
if (true) {
'Hello'
} else {
'Goodbye'
}
而true && 'Hello' || 'Goodbye'
true && 'Hello' || 'Goodbye'
不是if else
条件
true && 'Hello' || 'Goodbye'
相当于
(true && 'Hello') || 'Goodbye'
这会导致Hello
但它基于优先级。 考虑以下情况
'Goodbye' || (true && 'Hello')
这将导致Goodbye
。 更改顺序会更改输出,但三元运算符不会发生这种情况。
好像结果没有区别。 但是我对它们是如何处理的有一个猜测。 ()?:
实际上比&&||
快一点 (见下面的演示)。
(A)B?C:
基本上是一个 IF-Shorthand,所以(A)
部分被评估, B then
选择B then
或C else
堆栈。
(A)&&B||C
被完全评估
。 首先对(A)
进行评估。 之后发生了一些隐式转换(布尔转换) - 这需要一些时间
假 - 感谢“Gust van de Wal”
仍然有区别:小提琴
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 );
您的第一个案例是内联 if 语句的示例,而您的第二个案例是逻辑谓词的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.