寬鬆相等
與嚴格相等不同的地方: 寬鬆相等是兩個等號。
當 布林、字串 與其他型別做比對時,會轉為數值
console.log( 1 == 1 ) //true
console.log( 1 == '1') //true 型別不同,但會轉為數值
console.log( 1 != '1') //false
16進位制
//'0X11' 這是16進位制。
//0X 是指16進位
//11 代表 它的數值是16,加上右邊的 1
// 0X11 所以這邊的意思就是 '16+1'
console.log(17 == '0X11'); //true
布林 與 字串 相比
console.log(true == 'true'); //false
//原因是 這兩項皆會被轉為數值
console.log(Number(true))//布林 true 轉為數值是 1
console.log(Number('true'))//字串 true 轉為數值是 NaN
布林 true & false
true 轉換數值為 1;false 轉換數值為 2。
console.log(!0) //true (not false)
console.log('1' == !0) //true (1 == true)
嚴格相等
與寬鬆相等不同的地方: 嚴格相等是三個等號。
除了比較數值,也比較型態
console.log( 1 === '1') //false 型別不同
console.log( 1 === 1 ) //true
console.log( 1 !== '1') //true
嚴格相等的特例
//NaN = Not a Number
console.log(NaN === NaN) //false
console.log( +0 === -0) //true
Null & Undefined
Null & Undefined 無法被轉為數值型別來做比對
console.log(Number(null)); //0
console.log(Number(undefined)); // NaN
console.log(null == 0); // false
console.log(null == undefined); // true 寬鬆相等
console.log(null === undefined); // false 嚴格相等
嚴格相等回傳false的原因是:
Boolean(undefined); // false
Boolean(null); //false
false 寬鬆比較 false 會回傳 true。
物件與非物件 比對
物件與非物件比對時,會使用包裹物件來做轉換。
console.log([10]);
console.log(10 == [10]); //true
物件的轉換會套過包裹物件:
console.log(Number([10])); //10
console.log(10 == [10]); //true
範例二:
console.log(['a']);
console.log('a' == ['a']); //true
console.log(String(['a'])); //'a'
console.log('a' == ['a']); //true
那物件內的屬性呢?
console.log(String({A: 'a'})); //[object object]
console.log('[object object]' == String({A: 'a'})); //true
物件與物件 比對
物件與物件比對時,不是比對物件中的值,而是參考的位置。
console.log({} == {}); //false
//看起來值相同,但因為兩個{}所參考的位置不同。
陣列與陣列 比對
其實和 物件與物件 是相同的,因為都是物件型別
console.log([] == []); //false
//看起來值相同,但因為兩個[]所參考的位置不同。
物件型別在比對時,比較參考位置