24

测试代码是:

console.log(true && "abc");//abc

谁能告诉我为什么会这样abc

4

4 回答 4

20

来自MDN(逻辑运算符) - 逻辑与 (&&)

如果可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。

true显然不能评估为假,因此返回第二个值“abc”。

于 2012-07-18T14:33:15.343 回答
10

JavaScript 中的&&运算符与 C 或 Java 等中的运算符有些不同。它总是返回最后评估的子表达式值(无论整个表达式为真 - “真” - 或假 - “假”)并且不强制布尔结果. 当它失败时(当其中一个值是“falsy”时),结果同样是原始值,而不是值的布尔解释。

所以它是这样的:给定A && B,解释器执行以下操作:

  1. 计算表达式 A,给出 A V — A 的值
  2. 设 A B是将 A V转换为布尔值的结果
  3. 如果 A Bfalse,则&&表达式的值为 A V
  4. 计算表达式 B,给出 B V
  5. 返回 B V作为&&表达式的值。

因此,在if语句中,&&表达式与 C 或 Java 中的布尔转换运算符具有相同的效果,因为if语句本身对表达式的整体结果执行真/假测试。然而,当单独使用时,它更像是“如果第一个表达式为真,则给我第二个表达式的值,否则给我第一个表达式的值”。

于 2012-07-18T14:31:16.770 回答
1

&&如果左侧评估为false,则返回左侧,否则返回右侧大小。

trueis 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
于 2012-07-18T14:32:39.330 回答
1

您可以通过将表达式包装成以下内容来“修复”该问题!!()

!!(true && 'abc');
于 2012-07-18T14:33:04.957 回答