测试代码是:
console.log(true && "abc");//abc
谁能告诉我为什么会这样abc
?
如果可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。
true
显然不能评估为假,因此返回第二个值“abc”。
JavaScript 中的&&
运算符与 C 或 Java 等中的运算符有些不同。它总是返回最后评估的子表达式值(无论整个表达式为真 - “真” - 或假 - “假”)并且不强制布尔结果. 当它失败时(当其中一个值是“falsy”时),结果同样是原始值,而不是值的布尔解释。
所以它是这样的:给定A && B
,解释器执行以下操作:
false
,则&&
表达式的值为 A V&&
表达式的值。因此,在if
语句中,&&
表达式与 C 或 Java 中的布尔转换运算符具有相同的效果,因为if
语句本身对表达式的整体结果执行真/假测试。然而,当单独使用时,它更像是“如果第一个表达式为真,则给我第二个表达式的值,否则给我第一个表达式的值”。
&&
如果左侧评估为false
,则返回左侧,否则返回右侧大小。
true
is not 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');