【问题标题】:How do === and == handle null comparisons differently?=== 和 == 如何以不同的方式处理 null 比较?
【发布时间】:2011-11-13 23:58:37
【问题描述】:

我有一个简单的 json 解析对象,它有时定义了一个变量 tt,有时没有。

由于某种原因,jsonobject.tt == null 根据是否定义了tt 正确返回10jasonobject.tt === null 无论如何都会返回 0。我认为=== 是用来避免问题的。

这是怎么回事?

【问题讨论】:

    标签: javascript string json comparison


    【解决方案1】:

    === 是严格相等运算符,它比较类型和值。值 null 是 Null 类型,它只有一个值 - null

    Undefined 是未定义类型,它也只有一个值 - 'undefined'。

    使用严格相等运算符时,null !== undefined 因为它们是不同的类型(请参阅严格相等比较算法的第 1 步,ECMA-262 § 11.9.6)。

    == 是相等运算符。使用 == 的比较使用抽象相等比较算法 (ECMA-262 § 11.9.3),其中包括:

    1. 如果 Type(x) 与 Type(y) 相同,则 ...
    2. 如果 x 为 null 而 y 未定义,则返回 true。
    3. 如果 x 未定义且 y 为 null,则返回 true。

    所以 null == undefined 根据定义返回 true。严格来说,测试一个属性的存在(不管它的值如何),应该使用 hasOwnProperty

    if (jsonobject.hasOwnProperty('tt')) {
      // property exists
    }
    

    但在实践中,对 undefined 的严格测试并没有太大区别:

    if (jsonobject.tt === undefined) 
    

    因为属性是否存在并且具有 undefined 值或根本没有定义通常是等效的。使用=== 也意味着如果 tt 存在但被赋值为null,上述将返回 false。

    【讨论】:

      【解决方案2】:

      由于某种原因 (jsonobject.tt == null) 正确返回 1 或 0

      首先比较返回truefalse

      其次是你想要的

      jsonobject.tt === undefined

      如果一个值不存在,则它是未定义的。

      其他检测方法有

      !jsonobject.hasOwnProperty("tt");

      !("tt" in jsonobject)

      == 是一个完全奇怪的运算符的副作用,null == undefined。因此,如果属性不存在,jsonobject.tt == null 将返回 true

      【讨论】:

      • 这是评论,不是答案。在我添加评论时偷偷更新你的答案。
      • 我知道,发布一个简短的 sn-p 作为答案会让您成为“最古老”列表的首位,因此可能会获得更多选票;这在很大程度上是我不赞成这种做法的原因。
      • @zzzzBov 我更喜欢将其视为流式传输答案。除了 stackoverflow.com 没有用于流式回答的架构
      • 如果没有为早期修订提供版本控制,就很难对事物发表评论。
      • 很好,您提到了.hasOwnProperty()in 运算符:我认为这些通常是更好的选择,因为它们可以让您区分何时属性根本不存在和属性何时存在存在但值为undefined
      【解决方案3】:

      如果尚未定义变量,则其值为undefined

      undefined == null
      

      undefined !== null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多