文章中英模式
布魯斯前端JS面試題目 - 嚴格比較、鬆散比較與 Object.is() 差異解析
深入解析 JavaScript 中的 ==、===、Object.is() 比較方式與實務應用,以及淺比較與深比較的差異。
文章中英模式
懶得看文章?那就來看影片吧
==
vs ===
==
會進行型別轉換,適合鬆散判斷。===
僅在型別和值都一致時才回傳 true,為預設建議使用方式。
0 == '0' // true
false == 0 // true
null == undefined // true
[] == false // true
0 === '0' // false
false === 0 // false
null === undefined // false
Object.is 精確比較
Object.is()
幾乎等同 ===
,但能正確處理 NaN
、+0/-0
等邊界情況。
Object.is(NaN, NaN)
// trueObject.is(+0, -0)
// false- 適用於
React.memo
、useMemo
、底層框架需精確判斷變動時
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
Object.is(42, 42); // true
const obj1 = { a: 1 };
const obj2 = { a: 1 };
Object.is(obj1, obj2); // false(不同參考)
Object.is 是淺比較
Object.is()
只比較第一層 reference 或值,不會深入遞迴物件內容。
const a = { x: 1 };
const b = { x: 1 };
Object.is(a, b); // false
Object.is(a, a); // true
若需深比較,請使用如 lodash
的 isEqual
:
import isEqual from 'lodash.isequal';
isEqual(a, b); // true
🔥 常見面試題目
(一) ==
與 ===
差異為何?請舉例。
解答:==
會進行型別轉換,而 ===
不會。
0 == '' // true
false == 'false' // false
'123' === 123 // false
(二) NaN === NaN
結果為何?
解答:NaN
在 IEEE 754 中被定義為不等於任何值(包含自己),所以 NaN === NaN
為 false
,但如果需要精準比較,可以使用 Object.is(NaN, NaN)
,結果會為 true
。
(三) Object.is
的使用時機?
解答:例如 React 內部為了判斷 state 或 props 是否變化,使用 Object.is()
判斷是否需要重新 render。這能避免 NaN
、+0/-0
等邊界情況出錯,確保精準性與效能。
useEffect(() => {
// 一些程式碼...
}, [.....]) // <--- 依賴內部用Object.is比較
// 內部實作簡單概覽
// 如果新值與舊值透過 Object.is 比較為相同,就不更新
if (!Object.is(prevValue, nextValue)) {
updateState(nextValue);
}