繁体   English   中英

使用“&&”和“||”有什么区别通过三元运算符('?' 和 ':')?

[英]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 如果它们的计算结果为假,则返回thirdOperandGoodbye )。

在您的示例中,由于非空字符串为真,因此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 thenC 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM