我有一个简单的json解析对象,有时定义了变量tt
,有时却没有。
由于某些原因,jsonobject.tt == null
根据是否定义1
正确返回0
或tt
。无论如何jasonobject.tt === null
只返回0
。我认为===
是用来避免问题的东西。
这里发生了什么?
答案 0 :(得分:2)
===
是严格相等运算符,它比较类型和值。值null
是Null类型,只有一个值 - null
。
Undefined是Undefined Type,它也只有一个值 - 'undefined'。
使用严格相等运算符时,null!== undefined,因为它们是不同的类型(参见严格等式比较算法的第1步,ECMA-262§11.9.6)。
==
是相等运算符。使用==
进行的比较使用抽象平等比较算法(ECMA-262§11.9.3),其中包括:
- 如果Type(x)与Type(y)相同,那么......
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null,则返回true。
醇>
所以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
首先,比较会返回true
或false
其次你想要
jsonobject.tt === undefined
如果某个值不存在,则未定义。
其他检测方法
!jsonobject.hasOwnProperty("tt");
或
!("tt" in jsonobject)
==
作为一个非常奇怪的运算符null == undefined
的副作用。因此,如果属性不存在,jsonobject.tt == null
将返回true
答案 2 :(得分:0)
如果尚未定义变量,则其值为undefined
。
undefined == null
,而
undefined !== null