此篇主要探討兩種比較運算子 ==、=== 的差異。
比較運算子注意事項
在 JavaScript 中除了基礎型別(Primitive Type)以外的型別(ex: 陣列、物件)在做比較時,判斷的是兩者是否指向同一個 reference
,而非判斷兩者的值是否相同。
e.g. 陣列判斷
1 | let a = [1 , 2]; |
下方會範例會使用基礎型別(Primitive Type)來演示。
=
assignment:將等號右邊值賦予到左邊的變數。
1 | let num = 10; |
==
equality:比較等號兩邊值是否相同,當等號兩邊型別不同時,會先依照規則轉型再進行比對。(除了物件外,幾乎會轉型為 number 後在做比較)
紀錄一下看到的其它名稱:
Double equals operator (寬鬆相等)
equality comparison operator(相等比較運算子)
abstract comparison operator(抽象比較運算子)
1 | console.log('1' == 1); // true,1 == 1 |
===
strict equality:比較等號兩邊 型別
以及 數值
是否 都相同
。
紀錄一下看到的其它名稱:
identity comparison operator(身份比較運算子)
strict comparison operator(嚴格比較運算子)
1 | console.log('1' === 1); // false |
自動轉型差異
==:會依照規則轉型後再比較。
===:不會轉型直接比較。
例外
== 寬鬆比對下等號兩邊為 undefined 和 null 則回傳 true。
1 | console.log(undefined == null); // true |
== 寬鬆比對下空字串(字串為空或是僅有空白)則代表 false。
1 | console.log('' == false); // true,0 == 0 |
== 寬鬆比對下等號兩邊型別不同時,除了 object 外幾乎是轉型成 number 在做比對,
1 | console.log(true == 1); // true,1 |
非基礎型別、symbols 還需要比較 reference,相同才會回傳 true。
1 | console.log(true === true); // true |
NaN
- 等號其中一邊只要有 NaN 則回傳 false 。(一般會使用 isNan 去判斷 NaN)
1 | console.log(NaN == NaN); // false |
兩者皆為 0 則回傳 true。(不管正負)
1 | console.log(0 === -0); // true |
conclusion
== 特殊使用情境
1 | if (x === null || x === undefined) { |
1 | // 因為 typeof 出來的值會是固定的 javascript 型別,只是可能隨著時間流逝版本會有差異(ex: bigint) |
建議還是使用 === 嚴格比對。(除非非常暸解,且熟悉特殊情境時使用 ex:判斷是否為 null、undefined)
references
為了轉生而點技能-JavaScript,難題紀錄(二)隱式轉換規則及===、==
JS中的 {} + {} 與 {} + [] 的結果是什麼?