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

时间:2018-06-26 21:25:53

标签: javascript conditional conditional-operator

在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"

4 个答案:

答案 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。如果他们认为错误,请返回secondOperandthirdOperand)。

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