在 JavaScript 當中,==、=== 與 Object.is()的區別
2023年1月24日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
在 JavaScript 當中有許多可以比較相等與否的方法。其中最常見的三個分別是 ===
(嚴格比較)、 ==
(鬆散比較),以及 Object.is
(同值比較)。這三者有什麼不同呢? 一起來看看這題面試常會被問的基礎題吧。
==
鬆散比較 (loose equality)
==
在比較兩個值之前,會先強制轉換型別與值,舉例來說,下面的這三個例子,之所以會印出 true
,正是因為在比較前,型別被轉換了;否則數字 1
在 JavaScript 中跟字串 '1'
是代表不同的值,嚴格來說不應該相等。同理 undefined
與 null
在 JavaScript 是不同型別與不同的值,但如果使用 ==
會回傳 true
。
console.log(1 == "1"); // true
console.log(0 == false); // true
console.log(undefined == null); // true
因為會強制轉換型別,==
會帶給開發者一些困擾。因此多數的情況,不建議使用 ==
。
===
嚴格比較 (strict equality)
===
不會強制轉換型別與值,所以如果是不同型別,比較兩者會回傳 false
。不同值的話一樣會回傳 false
。不過有兩個情況例外,當我們比較 +0
和 -0
時,嚴格比較會回傳 true
;以及比較 NaN
和 NaN
會是 false
。而這兩個狀況則是同值比較 Object.is
派上用場的時候。
+0 === -0; // true
NaN === NaN; // false
Object.is
同值比較 (same-value equality)
同值比較顧名思義是在比較兩個值是不是相等。雖然它是 Object 開頭,但比較的可以是任意的兩個值。例如:
console.log(Object.is(1, 1)); // true
console.log(Object.is(1, "1")); // false
上面提到的兩種在 ===
時遇到的問題,可以透過 Object.is
有效分辨
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
不過如果要有效分辨 NaN
,在 JavaScript 有一個方法叫 isNaN
是可以使用的。端看開發團隊的習慣,假如對於 Object.is
感到陌生,可以選擇用 Number.isNaN
。