這是一個非常有深度且實用的主題!將經典的 JavaScript 基礎比較題目(==、=== 與 Object.is()),結合「現代前端框架/函式庫(如 React、Vue 等)的內部實作」來撰寫,能立刻讓文章從單純的語法說明升級為深度的工程實踐剖析。
| 比較方式 | 語法 | 型別轉換 (Coercion) | 特殊案例處置 | 主要用途 |
|---|---|---|---|---|
| 鬆散比較 | a == b |
會自動轉換 | 1 == "1" (true)null == undefined (true) |
現代開發極少使用(防禦性程式碼除外) |
| 嚴格比較 | a === b |
不會轉換 | NaN === NaN (false)+0 === -0 (true) |
日常業務邏輯開發的首選標準 |
| 同值比較 | Object.is(a, b) |
不會轉換 | Object.is(NaN, NaN) (true)Object.is(+0, -0) (false) |
準確判斷兩值是否完全相同 |
過渡引言:既然
===已經滿足 99% 的日常開發需求,為什麼現代前端函式庫(如 React、Vue、Redux)卻大量依賴Object.is()?
解釋現代 UI 框架的核心機制:「當資料變更時,觸發畫面重新渲染(Re-render)」。
==**:自動型別轉換會引發不可預期的渲染 Bug(例如 0 變為 false 卻沒被偵測到變化)。===**:NaN 的死角:若 state 計算結果前後都是 NaN,NaN === NaN 會是 false,導致框架誤以為資料改變而進行無謂的重新渲染。+0 與 -0 的符號差異:在某些高精度圖表或數學計算庫中,+0 與 -0 代表不同的極限方向,=== 無法區分。useState 與 useMemo說明 React 內部的 shallowEqual 或 Object.is 演算法:
Note:shallowCompare is a legacy add-on. Use React.memo or React.PureComponent instead.
useState 的前後值時,bailsout機制底層預設就是呼叫 Object.is(oldState, newState)。NaN 時,React 能正確判斷「值未改變」,從而跳過無效渲染(Bailout)。ref 與 reactive 在 setter 被觸發時,會先檢查 hasChanged(newValue, oldValue)。hasChanged 實作範例:const hasChanged = (value, oldValue) => !Object.is(value, oldValue);
Object.is() 的侷限:說明 Object.is({}, {}) 依然是 false(因為記憶體位址不同)。===,語法簡潔且涵蓋絕大多數情境。Object.is() 更加嚴謹。