我正在阅读我的书“优雅的JavaScript”,null == true
评估为假。使用口译员,我确认这是TRUE
。但是,在本章的后面 - 事实上,在同一页面上 - 它表示当作为if,while或for语句的条件给出null时,它将被转换为布尔值并返回false。 / p>
任何有更深入洞察力的人都可以告诉我为什么会这样吗?我知道在哪里可以找到浏览器源代码,但我不知道如何定位导致这种特殊和不正常行为的编程。因为我对C ++知之甚少,所以我也非常感谢有关单独查找这类信息的任何提示。
谢谢。
答案 0 :(得分:6)
要做的一个重要区别是Type
的{{1}}为Null
。
(忽略null
,因为设计和向后兼容性不佳,它会为typeof
返回"object"
。
11.9.3抽象等式比较算法#Ⓣ比较 x == y,其中x和y是值,产生true或false。这样的 比较如下:
[...剥离]
- 返回false。
醇>
表示与null
和null
的比较应该返回false,因为Boolean
和Type
的{{1}}不一样,并且没有11.9.3中的其他步骤适用,因此Null
的默认操作发生
Boolean
return false
和Type
的{{1}}不同,x
或y
x
y
只有null
但==
的唯一情况1}}操作仍然返回true
如果x为null且y未定义,则返回true。
如果x未定义且y为null,则返回true。
这意味着undefined == null
会返回true
特别说明:
有ES6:harmony proposal来修复typeof null
答案 1 :(得分:2)
实际上我认为他提到typeof null == 'object'
的事实,遗憾的是这种情况。但这是typeof运算符的特性,而不是null本身。 Null是假值,但typeof为它返回“object”,根据规范:http://bclary.com/2004/11/07/#a-11.4.3
答案 2 :(得分:1)
当您将null
与true
进行比较时,会将其评估为,因此它不等于false
,true
。类似地,当在任何其他必须被视为布尔值的上下文中使用时 - 如if
或while
表达式 - 它是false
。
说“null是类型对象”并不正确,因为它不是。它是null
。 它实际上没有任何类型,(感谢@Roee Gavirel)它有自己的类型(null类型),因为它不是任何东西。换句话说,如果变量的值为null
,则表示它没有引用;根本没有任何对象。
编辑 - 因为我的大脑仍处于睡眠状态,所以请保持一秒钟。
好的,这是规范中的内容。如果==
的一个操作数是布尔值,那么布尔值将被转换为数字(是的),转换就是这样进行的。这就是null
对==
和true
都false
为何的原因。因此,“陌生感”与null
并不是关于评估==
比较的复杂规则。
ECMA-262标准的第11.9.3节以一种或多或少可理解的方式解释了这一切。我只想说==
的语义并不简单。
答案 3 :(得分:0)
我看不出有什么问题...... if(null == true)= false then(null == false)= true。
如果“为什么”是问题,那么答案就是易用性。 (可能取自C)但如果您想知道参考文献是否有效,您可以这样做:
if (RefValue) {
//bla bla bla
}
而不是:
if (RefValue == null) {
//bla bla bla
}