我有一個簡單的json解析對象,有時有一個變量tt
定義,有時沒有。===和==如何處理空比較的不同?
由於某些原因,jsonobject.tt == null
根據是否定義了tt
而正確返回1
或0
。無論如何,jasonobject.tt === null
只返回0
。我認爲===
是用來避免問題的東西。
這是怎麼回事嗎?
我有一個簡單的json解析對象,有時有一個變量tt
定義,有時沒有。===和==如何處理空比較的不同?
由於某些原因,jsonobject.tt == null
根據是否定義了tt
而正確返回1
或0
。無論如何,jasonobject.tt === null
只返回0
。我認爲===
是用來避免問題的東西。
這是怎麼回事嗎?
===
是全等運算符,它作爲比較值輸入爲好。值null
是具有一個值的空類型 - null
。
未定義的是未定義類型,它也只有一個值 - '未定義'。
當使用嚴格相等運算符時,null!==未定義,因爲它們是不同的類型(參見嚴格相等比較算法ECMA-262第11.9.6節的步驟1)。
==
是平等運算符。使用==
使用摘要相等比較算法(ECMA-262§11.9.3),其中包括比較:
- 如果Type(x)是相同類型(Y),然後...
- 如果x爲null且y未定義,則返回true。
- 如果x未定義且y爲null,則返回true。
所以null == undefined
根據定義返回true。嚴格地說,測試一個屬性(無論價值)的情況下,應該使用hasOwnProperty:
if (jsonobject.hasOwnProperty('tt')) {
// property exists
}
然而,在實踐中沒有太大差別了嚴格的測試未定義:
if (jsonobject.tt === undefined)
因爲屬性是否存在並且值爲未定義或根本沒有定義通常是等同的。使用===
也意味着如果tt存在但已被賦值爲null
,則以上將返回錯誤。
出於某種原因(jsonobject.tt == NULL)正確返回1或0
首先一個比較返回true
或false
其次你要
jsonobject.tt === undefined
如果一個值不存在,它是未定義的。
其他檢測方法是
!jsonobject.hasOwnProperty("tt");
或
!("tt" in jsonobject)
作爲==
副作用是一個完全怪異操作者,null == undefined
。因此,如果該屬性不存在,則jsonobject.tt == null
將返回true
如果未定義變量,則其值爲undefined
。
undefined == null
而
undefined !== null
這是一條評論,而不是答案。當我添加我的評論時,偷偷更新您的答案。 – zzzzBov
@zzzzBov歡迎來到西部最快的槍。 – Raynos
我知道發佈一個簡短的摘錄作爲答案可以使你成爲「最古老的」榜單的榜首,因此可能獲得更多的選票;這主要是我不贊成這種做法的原因。 – zzzzBov