為什么 === 比 == 安全?7個類型轉(zhuǎn)換黑洞
類型轉(zhuǎn)換是 JavaScript 里最容易讓人踩坑的特性之一。尤其是雙等號(==)的隱式類型轉(zhuǎn)換,經(jīng)常會產(chǎn)生一些令人意想不到的結(jié)果。讓我們一起深入了解這些陷阱,避免在實際開發(fā)中犯錯。
陷阱一:數(shù)字與字符串比較
這可能是最常見的類型轉(zhuǎn)換場景,但也藏著不少坑:
console.log(1 == '1') // true
console.log(1 == '1.0') // true
console.log(1 == '01') // true
console.log(0 == '') // true
// 更離譜的例子
console.log(999 == '999fitness') // false
console.log(0 == '0.0000') // true
這里的轉(zhuǎn)換規(guī)則是:當(dāng)數(shù)字和字符串比較時,會嘗試將字符串轉(zhuǎn)換為數(shù)字。但如果字符串不是一個有效的數(shù)字表示,結(jié)果就會出人意料。
陷阱二:布爾值的轉(zhuǎn)換
布爾值在比較時會先被轉(zhuǎn)換為數(shù)字(true 轉(zhuǎn)為 1,false 轉(zhuǎn)為 0):
console.log(true == 1) // true
console.log(false == 0) // true
console.log(true == '1') // true
console.log(false == '') // true
// 令人困惑的例子
console.log(false == '0') // true
console.log(true == '2') // false
console.log(true == ['1']) // true ??
陷阱三:null 和 undefined
null 和 undefined 的比較規(guī)則特殊:
這是因為 null == undefined 是特殊規(guī)定的,而在涉及大小比較時,null 會被轉(zhuǎn)換為數(shù)字 0。
陷阱四:對象與原始類型比較
當(dāng)對象與原始類型比較時,會調(diào)用對象的 valueOf() 或 toString() 方法:
陷阱五:數(shù)組的特殊情況
空數(shù)組和數(shù)組的轉(zhuǎn)換規(guī)則尤其令人困惑:
陷阱六:多重類型轉(zhuǎn)換
當(dāng)涉及多個操作數(shù)時,轉(zhuǎn)換規(guī)則會變得更加復(fù)雜:
陷阱七:NaN 的比較
NaN 是 JavaScript 中最特殊的值之一:
console.log(NaN == NaN) // false
console.log(NaN === NaN) // false
console.log(typeof NaN) // "number"
// 正確的檢查方式
console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true