做&&和|| 运营商将他们的操作数转换为布尔值?

ppe*_*her 14 javascript

Flanagan的O'Reilly JavaScript书籍指出:

与&&和||不同 经营者,!运算符在反转转换后的值之前将其操作数转换为布尔值[...].

如果这些逻辑运算符不将操作数转换为布尔值,那么如何计算表达式?

Poi*_*nty 10

它们确实将值转换为boolean,但用于确定如何继续评估表达式.表达式的结果不一定是布尔值(事实上,如果你的操作数都不是boolean,它就不会给你一个布尔值):

var x = false || 'Hello' // gives you 'Hello'
var y = 0 && 1           // gives you 0, because 0 is "falsy" and short circuits
var z = 1 || 2           // gives you 1, because 1 is "truthy" and short circuits
Run Code Online (Sandbox Code Playgroud)


小智 5

根据规范,第 11.11 节:二元逻辑运算符:

[评估] 的产生&&...评估如下:

  1. 令 lref 为计算 LogicalANDExpression 的结果。
  2. 令 lval 为 GetValue(lref)。
  3. 如果ToBoolean(lval)为 false,则返回 lval。
  4. 令 rref 为计算 BitwiseOREExpression 的结果。
  5. 返回 GetValue(rref)。

[评估] 的产生||...评估如下:

  1. 令 lref 为计算 LogicalOREExpression 的结果。
  2. 令 lval 为 GetValue(lref)。
  3. 如果ToBoolean(lval)为 true,则返回 lval。
  4. 令 rref 为计算 LogicalANDExpression 的结果。
  5. 返回 GetValue(rref)。

所以在内部该值被“转换为布尔值”。然而,由于这一点从未暴露出来——并且整个语义解释是一个可以被“优化”的抽象——&&并且 和的行为||可以通过使用真值和假值来简单地解释(其中ToBoolean涵盖:真值是ToBoolean返回 true 的值,所有其他值都是 false)。

的逻辑表&&是:

抗体结果
真实的任何b
任意 a 为假

的逻辑表||是:

抗体结果
真实的任何一个
任意 b 为假值

请注意,要么返回a或 的计算值。b

快乐编码。


为了完整起见,请参阅第 9.2 节:

抽象操作ToBoolean将其参数转换为布尔类型的值,如...

  • 未定义 - 假
  • 空-假
  • 布尔值(不是布尔对象!) - 结果等于输入参数(无转换)。
  • number(不是 Number 对象!) - 如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为真。
  • string(不是 String 对象!) - 如果参数是空 String(其长度为零),则结果为 false;否则结果为真。
  • 对象 - true

  • @ppecher:“falsey”表示当需要布尔值时“类似于”“false”的值。换句话说,任何“ToBoolean”都会转换为“false”。所以,`""`、`0`、`null` 等都是“假”的。“false”表示实际的布尔值“false”。 (2认同)