使用'&&'和'||'有什么区别通过三元运算符('?' 和 ':')?
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 then
或 C 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 );
在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 then
或 C 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 );