Null是类型对象,所以它是真的吗?幕后发生了什么?

时间:2011-10-03 11:27:37

标签: javascript c++ types programming-languages type-conversion

我正在阅读我的书“优雅的JavaScript”,null == true评估为假。使用口译员,我确认这是TRUE。但是,在本章的后面 - 事实上,在同一页面上 - 它表示当作为if,while或for语句的条件给出null时,它将被转换为布尔值并返回false。 / p>

任何有更深入洞察力的人都可以告诉我为什么会这样吗?我知道在哪里可以找到浏览器源代码,但我不知道如何定位导致这种特殊和不正常行为的编程。因为我对C ++知之甚少,所以我也非常感谢有关单独查找这类信息的任何提示。

谢谢。

4 个答案:

答案 0 :(得分:6)

要做的一个重要区别是Type的{​​{1}}为Null

(忽略null,因为设计和向后兼容性不佳,它会为typeof返回"object"

  

11.9.3抽象等式比较算法#Ⓣ比较   x == y,其中x和y是值,产生true或false。这样的   比较如下:

     

[...剥离]

     
      
  1. 返回false。
  2.   

The ES5 specification

表示与nullnull的比较应该返回false,因为BooleanType的{​​{1}}不一样,并且没有11.9.3中的其他步骤适用,因此Null的默认操作发生

Boolean return falseType的{​​{1}}不同,xy 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)

当您将nulltrue进行比较时,会将其评估为false,因此它不等于true。类似地,当在任何其他必须被视为布尔值的上下文中使用时 - 如ifwhile表达式 - 它是false

说“null是类型对象”并不正确,因为它不是。它是null它实际上没有任何类型,(感谢@Roee Gavirel)它有自己的类型(null类型),因为它不是任何东西。换句话说,如果变量的值为null,则表示它没有引用;根本没有任何对象。

编辑 - 因为我的大脑仍处于睡眠状态,所以请保持一秒钟。

好的,这是规范中的内容。如果==的一个操作数是布尔值,那么布尔值将被转换为数字(是的),转换就是这样进行的。这就是null==truefalse为何的原因。因此,“陌生感”与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
}