【问题标题】:Null is type object, so it's truthy? What's going on behind the scenes?Null 是类型对象,所以它是真的吗?幕后发生了什么?
【发布时间】:2011-11-29 20:45:57
【问题描述】:

我正在阅读我的书“优雅的 JavaScript”,null == true 评估为假。通过翻译,我确认这是TRUE。然而,在本章的后面——事实上,在同一页上——它说当 null 作为 if、while 或 for 语句的条件时,它将被转换为布尔值并返回 false。

谁能告诉我这是为什么?我知道在哪里可以找到浏览器源代码,但我不确定如何定位导致这种特殊和不直观行为的编程。因为我对 C++ 知之甚少,所以我也非常感谢有关独立查找此类信息的任何提示。

谢谢。

【问题讨论】:

  • 对不起,我传递的信息有误。引用是:“对象是真实的,而 null 是对象类型”。我读到,“如果一个对象的原始值是虚假的,那么该对象仍然是真实的”。 Null 是假的,不过,在大众投票看来。

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


【解决方案1】:

一个重要的区别是TypenullNull

(忽略 typeof 它返回 "object"null 因为糟糕的设计和向后兼容性)

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

[...剥离]

  1. 返回 false。

The ES5 specification

表示与nullBoolean 的比较应该返回false,因为NullBooleanType 不一样,并且11.9.3 中的其他步骤都不适用,因此return false 的默认操作发生

xyType 不同且 xy 的唯一情况是 null== 操作仍返回 true

如果 x 为 null 而 y 未定义,则返回 true。

如果 x 未定义且 y 为 null,则返回 true。

这意味着undefined == null 返回true

特别注意:

有一个ES6:harmony proposal 来修复typeof null

【讨论】:

  • 这远非 javascript 中最糟糕的事情 :) 我个人最讨厌的错误是私有函数中“this”的值。原因是javascript基本上是一个人在很短的时间内开发完成的。考虑到这一点,这实际上是一部非常了不起的作品,但在各个方面都远非完美。
  • 在另一个函数中定义的函数肯定是私有的,外部函数之外的任何东西都不能直接访问它。它与函数中定义的任何其他变量一样私有。 “this”的默认值未定义(或window)。我认为将它定义为与 this 的外部值相同会更有意义。
  • 我想我忘了点击更新:jsfiddle.net/jamietre/wbPvz/3 .. 关键是,this 指的是父对象,除非另有定义 except 当函数在另一个功能。这是不一致的。
  • @jamietre 这只是与当前问题this can be taken to chat 的一个切线。还有counter fiddle。作为旁注 JavaScript Garden explain this 非常好,它的工作方式完全不同,基于函数执行或方法执行
  • @jamietre “This”默认指的是函数所属的对象。不正确this 的值完全由调用函数的方式确定,并且在每次调用时都进行确定。
【解决方案2】:

当您将nulltrue 进行比较时,它被评估为false 所以它不等于true。同样,当在任何其他必须将其视为布尔值的上下文中使用时(例如 ifwhile 表达式),它是 false

说“null 是类型对象”是不正确的,因为它不是。它是null它实际上没有任何类型,(感谢@Roee Gavirel)它有自己的类型(null 类型),因为它什么都不是。换句话说,如果一个变量的值为null,这意味着它没有引用任何东西;根本没有对象。

edit — 等等,因为我的大脑还在睡觉。

好的,这就是规范中的内容。如果== 的操作数之一是布尔值,则布尔值将转换为数字(确实如此),并且转换以这种方式进行。这就是为什么null 既不是true 也不是false==。因此,“奇怪”与其说是关于 null,不如说是关于评估 == 比较的复杂规则。

ECMA-262 标准的第 11.9.3 节以或多或少可以理解的方式详细说明了这一切。可以说== 的语义一点也不简单。

【讨论】:

  • 不正确,NULL 是一种只能接受一个值(null)的类型。它还具有自动转换为 bool(在需要时)并返回 false 的功能。
  • 我从朋友那里收集到“null”是类型对象的信息,所以它不可靠,这就是我提出这个问题的原因。 :) 我不确定这是否是一种有效的检查方式,但typeof(null) 在我的解释器中返回object
  • @Pointy 底部的 11.9.3 说“如果以上都不适用,则返回 false”,这就是发生的情况
  • @Roee,我可以请你加入我的行列:stackoverflow.com/questions/7634584/whats-an-auto-casting-bool 吗?当然,我已经查过谷歌了。
  • 这里是文档的链接:ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf。很酷的网页。
【解决方案3】:

其实我觉得他指的是typeof null == 'object'这个事实,很不幸就是这样。但这是 typeof 运算符的特性,而不是 null 本身的特性。 Null 是假值,但 typeof 为它返回“对象”,根据规范:http://bclary.com/2004/11/07/#a-11.4.3

【讨论】:

    【解决方案4】:

    我看不出有什么问题...
    if (null == true) = false then (null == false) = true。

    如果“为什么”是问题,那么答案就是易于使用。 (可能取自 C)但如果您想知道引用是否有效,您可以这样做:

    if (RefValue) {
        //bla bla bla
    }
    

    然后:

    if (RefValue == null) {
        //bla bla bla
    }
    

    【讨论】:

    • if (something) 测试真实性。 if (a==b) 尝试将两个项目转换为相同的类型并比较它们,这仅适用于存在的事物。 (例如 undefined==false 也是错误的)。如果您需要明确地与一个对象进行比较,您可以使用!! 将其转换为真/假,例如!!null==false
    • @jamietre 这应该在口译员中工作得更好。我一直无法弄清楚如何通过 if 语句进行测试。很高兴知道这个新技巧。我希望它在我的书中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多