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

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"

您的第一个案例是内联 if 语句的示例,而您的第二个案例是逻辑谓词的示例。

三元运算符

这是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。更改顺序会更改输出,但三元运算符不会发生这种情况。

这是两个不同的概念,却恰好给你相同的答案。


第一个示例使用 ternary operator其结果 取决于第一个操作数 (在您的示例中 true/false):

true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"

它是 if/else 的 shorthand 形式。如果第一个操作数为真,则 return 第二个操作数 (Hello)。如果第一个操作数是假的,return 第三个操作数 (Goodbye).

你的第一个例子的第一个表达式可以重写为:

if (true)
    return 'Hello';
else
    return 'Goodbye';

第二个例子使用了logical operators其结果取决于第一个和第二个操作数

true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"

如果 firstOperand && secondOperand 的计算结果为真值,return secondOperand。如果他们评估为虚假的东西,return thirdOperand (Goodbye).

在您的示例中,由于非空字符串为真,因此 true && 'Hello' 的计算结果为 Hello,而 false && 'Hello' 的计算结果为 false

所以你的第二个例子变成:

'Hello' || 'Goodbye'
false || 'Goodbye'

由于 || 的工作原理,这恰好输出了您的第一个示例输出的内容,但它们是不同的概念。

请注意在第一个示例中,我们如何在评估第一个操作数后知道 return 的内容。在第二个示例中,我们必须先计算前 两个 操作数,然后才能知道 return.

的内容

似乎结果没有什么不同。但是我猜想它们是如何被处理的。 ()?: 实际上比 &&|| 快一点点(见下面的演示)。

(A)B?C: 基本上是一个 IF-Shorthand,所以 (A) 部分被评估,并且选择 B thenC else 堆栈。

(A)&&B||C 完全评估。首先对 (A) 进行评估。之后发生了一些 implicit conversion(Boolean conversion) - 这需要一些时间

false - thx to "Gust van de Wal"

Still a difference: fiddle

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