测试代码为:
console.log(true && "abc");//abc
谁能告诉我为什么结果是abc
?
来自MDN(逻辑运算符)-逻辑与(&&):
如果expr1可以转换为false,则返回它;否则,返回因此,当与布尔值一起使用时,&;如果两者都为true操作数为真;否则,返回false。
true
显然不能计算为false,因此返回第二个值,即"abc"。
JavaScript中的&&
运算符与C或Java等中的有所不同。它总是返回最后一个求值的子表达式值(无论整个表达式是true—"truthy"—还是false—"falsy"),并且不强制生成布尔结果。当它失败时(当其中一个值为"falsy"时),类似地,结果是原始值,而不是值的布尔解释。
所以它是这样的:给定A && B
,解释器执行以下操作:
- 评估表达式A,给出AV—A的值
- 设AB是将AV强制转换为布尔值的结果
- 如果AB是
false
,则&&
表达式的值是AV - 评估表达式B,给出BV
- 返回BV作为
&&
表达式的值
因此,在if
语句中,&&
表达式具有与C或Java中的布尔型强制转换运算符相同的效果,因为if
语句本身对表达式的整体结果执行truthy/falsy测试。然而,当它自己使用时,它更像是,"如果第一个表达式是真的,就给我第二个表达式的值,否则就给我第一个表达式的价值"。
&&
返回左手边,如果左手边计算为false
,则返回右手边大小。
true
不是false
,所以它返回右手边,这是您的字符串。
> 0 && true // LHS is false, return LHS
0
> 1 && true // LHS is true, return RHS
true
> false && 0 // LHS is false, return LHS
false
> true && false // LHS is true, return RHS
false
您可以通过将表达式包装到!!()
:中来"修复"这个问题
!!(true && 'abc');