寬鬆相等、嚴格相等以及隱含轉型


Posted by hoyi-23 on 2021-05-19

寬鬆相等

與嚴格相等不同的地方: 寬鬆相等是兩個等號。
當 布林、字串 與其他型別做比對時,會轉為數值

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
//看起來值相同,但因為兩個[]所參考的位置不同。

物件型別在比對時,比較參考位置


#寬鬆相等 #嚴格相等 #型別轉換







Related Posts

Day 165

Day 165

漫談傳輸介面-PCIe

漫談傳輸介面-PCIe

Day07 LIFF (LINE Front-end Framework)

Day07 LIFF (LINE Front-end Framework)


Comments