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 节:二元逻辑运算符:
[评估] 的产生&&
...评估如下:
ToBoolean(lval)
为 false,则返回 lval。[评估] 的产生||
...评估如下:
ToBoolean(lval)
为 true,则返回 lval。所以在内部该值被“转换为布尔值”。然而,由于这一点从未暴露出来——并且整个语义解释是一个可以被“优化”的抽象——&&
并且 和的行为||
可以通过使用真值和假值来简单地解释(其中ToBoolean
涵盖:真值是ToBoolean
返回 true 的值,所有其他值都是 false)。
的逻辑表&&
是:
抗体结果 真实的任何b 任意 a 为假
的逻辑表||
是:
抗体结果 真实的任何一个 任意 b 为假值
请注意,要么返回a
或 的计算值。b
快乐编码。
为了完整起见,请参阅第 9.2 节:
抽象操作ToBoolean
将其参数转换为布尔类型的值,如...