== (或者 !=) 操作在需要的情況下自動進行了類型轉(zhuǎn)換盛嘿。=== (或 !==)操作不會執(zhí)行任何轉(zhuǎn)換。===在比較值和類型時括袒,可以說比==更快次兆。
[10] == 10 // 為 true
[10] === 10 // 為 false
'10' == 10 // 為 true
'10' === 10 // 為 false
[] == 0 // 為 true
[] === 0 // 為 false
'' == false // 為 true 但 true == "a" 為false
'' === false // 為 false
而在ES6中,Object.is()類似于===锹锰,但在三等號判等的基礎(chǔ)上特別處理了 NaN 类垦、-0 和 +0 ,保證 -0 和 +0 不再相同城须,但 Object.is(NaN, NaN) 會返回 true蚤认。
下面這些情況Object.is()會認為兩個值是相同的:
兩個值都是 undefined
兩個值都是 null
兩個值都是 true 或者都是 false
兩個值是由相同個數(shù)的字符按照相同的順序組成的字符串
兩個值指向同一個對象
兩個值都是數(shù)字并且
都是正零 +0
都是負零 -0
都是 NaN
都是除零和 NaN 外的其它同一個數(shù)字
這種相等性判斷邏輯和傳統(tǒng)的==運算符所用的不同,== 運算符會對它兩邊的操作數(shù)做隱式的類型轉(zhuǎn)換(如果它們是不同類型的值的話)糕伐,然后才進行相等性比較砰琢,(所以才會有類似 "" == false 為 true 的現(xiàn)象),但 Object.is 不會做這種類型轉(zhuǎn)換。
而且陪汽,即便嚴格相等運算符 === 不會對操作數(shù)進行類型轉(zhuǎn)換训唱,但它不能區(qū)分兩個不同的數(shù)字 -0 和 +0,還會把兩個 NaN 看成是不相等的挚冤。
Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
var test = { a: 1 };
Object.is(test, test); // true
Object.is(null, null); // true
// 兩個特例况增,=== 也沒法判斷的情況
Object.is(0, -0); // false
Object.is(NaN, 0/0); // true