===和==如何以不同的方式处理空比较?

时间:2011-11-13 23:58:38

标签: javascript string json comparison

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

由于某些原因,jsonobject.tt == null根据是否定义1正确返回0tt。无论如何jasonobject.tt === null只返回0。我认为===是用来避免问题的东西。

这里发生了什么?

3 个答案:

答案 0 :(得分:2)

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

Undefined是Undefined Type,它也只有一个值 - 'undefined'。

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

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

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

所以null == undefined按定义返回true。严格来说,测试属性的存在(无论其值如何),应使用 hasOwnProperty

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

然而在实践中, undefined 的严格测试没有太大区别:

if (jsonobject.tt === undefined) 

因为属性是否存在且值未定义或者根本没有定义,通常是等效的。使用===也意味着如果 tt 存在但是已经为null分配了值,则上述内容将返回false。

答案 1 :(得分:0)

  

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

首先,比较会返回truefalse

其次你想要

jsonobject.tt === undefined

如果某个值不存在,则未定义。

其他检测方法

!jsonobject.hasOwnProperty("tt");

!("tt" in jsonobject)

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

答案 2 :(得分:0)

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

undefined == null

,而

undefined !== null