2011-11-13 22 views
0

我有一個簡單的json解析對象,有時有一個變量tt定義,有時沒有。===和==如何處理空比較的不同?

由於某些原因,jsonobject.tt == null根據是否定義了tt而正確返回10。無論如何,jasonobject.tt === null只返回0。我認爲===是用來避免問題的東西。

這是怎麼回事嗎?

回答

2

===是全等運算符,它作爲比較值輸入爲好。值null是具有一個值的空類型 - null

未定義的是未定義類型,它也只有一個值 - '未定義'。

當使用嚴格相等運算符時,null!==未定義,因爲它們是不同的類型(參見嚴格相等比較算法ECMA-262第11.9.6節的步驟1)。

==是平等運算符。使用==使用摘要相等比較算法(ECMA-262§11.9.3),其中包括比較:

  1. 如果Type(x)是相同類型(Y),然後...
  2. 如果x爲null且y未定義,則返回true。
  3. 如果x未定義且y爲null,則返回true。

所以null == undefined根據定義返回true。嚴格地說,測試一個屬性(無論價值)的情況下,應該使用hasOwnProperty

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

然而,在實踐中沒有太大差別了嚴格的測試未定義

if (jsonobject.tt === undefined) 

因爲屬性是否存在並且值爲未定義或根本沒有定義通常是等同的。使用===也意味着如果tt存在但已被賦值爲null,則以上將返回錯誤。

0

出於某種原因(jsonobject.tt == NULL)正確返回1或0

首先一個比較返回truefalse

其次你要

jsonobject.tt === undefined

如果一個值不存在,它是未定義的。

其他檢測方法是

!jsonobject.hasOwnProperty("tt");

!("tt" in jsonobject)

作爲==副作用是一個完全怪異操作者,null == undefined。因此,如果該屬性不存在,則jsonobject.tt == null將返回true

+0

這是一條評論,而不是答案。當我添加我的評論時,偷偷更新您的答案。 – zzzzBov

+0

@zzzzBov歡迎來到西部最快的槍。 – Raynos

+0

我知道發佈一個簡短的摘錄作爲答案可以使你成爲「最古老的」榜單的榜首,因此可能獲得更多的選票;這主要是我不贊成這種做法的原因。 – zzzzBov

0

如果未定義變量,則其值爲undefined

undefined == null 

undefined !== null