【发布时间】:2011-11-13 23:58:37
【问题描述】:
我有一个简单的 json 解析对象,它有时定义了一个变量 tt,有时没有。
由于某种原因,jsonobject.tt == null 根据是否定义了tt 正确返回1 或0。 jasonobject.tt === null 无论如何都会返回 0。我认为=== 是用来避免问题的。
这是怎么回事?
【问题讨论】:
标签: javascript string json comparison
我有一个简单的 json 解析对象,它有时定义了一个变量 tt,有时没有。
由于某种原因,jsonobject.tt == null 根据是否定义了tt 正确返回1 或0。 jasonobject.tt === null 无论如何都会返回 0。我认为=== 是用来避免问题的。
这是怎么回事?
【问题讨论】:
标签: javascript string json comparison
=== 是严格相等运算符,它比较类型和值。值 null 是 Null 类型,它只有一个值 - null。
Undefined 是未定义类型,它也只有一个值 - '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)
因为属性是否存在并且具有 undefined 值或根本没有定义通常是等效的。使用=== 也意味着如果 tt 存在但被赋值为null,上述将返回 false。
【讨论】:
由于某种原因 (jsonobject.tt == null) 正确返回 1 或 0
首先比较返回true 或false
其次是你想要的
jsonobject.tt === undefined
如果一个值不存在,则它是未定义的。
其他检测方法有
!jsonobject.hasOwnProperty("tt");
或
!("tt" in jsonobject)
== 是一个完全奇怪的运算符的副作用,null == undefined。因此,如果属性不存在,jsonobject.tt == null 将返回 true
【讨论】:
.hasOwnProperty() 和in 运算符:我认为这些通常是更好的选择,因为它们可以让您区分何时属性根本不存在和属性何时存在存在但值为undefined。
如果尚未定义变量,则其值为undefined。
undefined == null
而
undefined !== null
【讨论】: