我在chrome console中做了一些练习
>>var a = 2;
>> a || 3
2
and
>>a && 3
3
为什么以及如何...输出不应该是真或假,请解释一下,也许我错了,我认为这些算子应该返回true或false。
答案 0 :(得分:2)
如果lVal
是真正的 [2] ,则逻辑AND(&&)运算符会计算其右操作数。
值。
类似地,如果lVal
是伪造的 [1] 值,则逻辑OR(||)运算符会计算其右操作数。
因此,引用ES5规范
[...]和&&amp ;;或|| operator 不一定是Boolean类型。生成的值始终是两个操作数表达式之一的值。 {{ 3}}
来自MDN文章(ES5 §11.11)
Operator | Usage | Description
_____________________________________________________________________________________________________
Logical AND (&&) | expr1 && expr2 | Returns expr1 if it can be converted
| | to false; otherwise, returns expr2.
| | Thus, when used with Boolean values,
| | && returns true if both operands are true; otherwise, returns false.
_________________________________________________________________________________________________
Logical OR (||) | expr1 || expr2 | Returns expr1 if it can be converted to true; otherwise, returns expr2.
| | Thus, when used with Boolean values,
| | || returns true if either operand is true; if both are false, returns false.
[1]如果值可以转换为false
,则该值被视为假
这适用于值false
,0
,""
,null
,undefined
,NaN
[2]真实值是任何非虚假的值 [1]
答案 1 :(得分:1)
如果您在控制台中键入单个数字或其他任何内容,则会发生这种情况。你得到了最后评估的东西。
你实际上是在说(以伪代码而不是JS)
[return value] = 2 or 3
2
评估为true
,因此无需评估3
(短路评估)。要评估的最后一件事是2
,所以你得到2
。
[return value] = 2 and 3
2
为true
,因此也评估3
。要评估的最后一件事是3
,因此您得到3
Mozilla Developer Network上解释了这一点。
答案 2 :(得分:0)
一般来说,
当等式的所有元素都是布尔类型
时,逻辑运算符返回布尔值
否则他们就像
一样// b assign a. If !a then assign 3
var b = a || 3;
// b assign a but only if it would evaluate to false. Otherwise assign 3
var b = a && 3;
答案 3 :(得分:0)
当你有a || b
JavaScript评估表达式并将正在评估的第一个值返回到true
时,在你的情况下2
(其中一个原因是懒惰的评估)。
在第二个示例a && b
中,JavaScript需要同时评估a
和b
,以确保连词为true
。这样,JavaScript会将最后评估的内容返回到true
- 3
。如果表达式被评估为false
,则解释器将为您提供false
(如果任何操作数被评估为false
,则会发生这种情况。)
答案 4 :(得分:0)
如果您检查a || b
并且a
被转换为真值,则此表达式将返回第一个真实操作数,因为它足以评估OR
表达式,而不会继续评估(2 || 3
将返回2
,但0 || 3
将返回3
,因为零被视为虚假值)
但是如果你检查2 && 3
,你必须确保两个操作数都是真的,所以javascript将对它们进行全部评估并返回最后一个操作数评估(如果你检查3 && 0 && 2
表达式将返回{{ 1}}因为这个操作数是假的 - 作为0
表达式 - 没有必要进一步评估)
此行为解释了为什么AND
和||
也称为短路布尔运算符
如果你想要整个表达式的布尔结果只是尝试这种方式
&&
示例:
!!(<expression>)