iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
Modern Web

現代函式庫與JavaScript的關係系列 第 2

Day2《JavaScript 比較運算子全解:現代框架是如何利用 Object.is() 監測 State 變化的?》

  • 分享至 

  • xImage
  •  

這是一個非常有深度且實用的主題!將經典的 JavaScript 基礎比較題目(=====Object.is()),結合「現代前端框架/函式庫(如 React、Vue 等)的內部實作」來撰寫,能立刻讓文章從單純的語法說明升級為深度的工程實踐剖析

  • 切入型:《從 ==、=== 到 Object.is():為何現代前端框架(React / Vue)離不開同值比較?》
  • 實戰型:《JavaScript 比較運算子全解:現代框架是如何利用 Object.is() 監測 State 變化的?》

文章結構與核心內容規劃

一、 基礎重溫:三者的核心差異(簡潔表格式帶過)

比較方式 語法 型別轉換 (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()


二、 現代函式庫的核心需求:狀態變更偵測(State Change Detection)

解釋現代 UI 框架的核心機制:「當資料變更時,觸發畫面重新渲染(Re-render)」

  • 問題點:框架需要一種無副作用且極度準確的方法來判斷「狀態(State)到底有沒有變」?
  • **為什麼不用 ==**:自動型別轉換會引發不可預期的渲染 Bug(例如 0 變為 false 卻沒被偵測到變化)。
  • **為什麼不只用 ===**
  1. NaN 的死角:若 state 計算結果前後都是 NaNNaN === NaN 會是 false,導致框架誤以為資料改變而進行無謂的重新渲染。
  2. +0-0 的符號差異:在某些高精度圖表或數學計算庫中,+0-0 代表不同的極限方向,=== 無法區分。

三、 實戰剖析:現代函式庫如何運用 JavaScript 比較機制

1. React 的 useStateuseMemo

說明 React 內部的 shallowEqualObject.is 演算法:

Note:shallowCompare is a legacy add-on. Use React.memo or React.PureComponent instead.

  • React 在比對 useState 的前後值時,bailsout機制底層預設就是呼叫 Object.is(oldState, newState)
  • 當傳入相同的 NaN 時,React 能正確判斷「值未改變」,從而跳過無效渲染(Bailout)。
2. Vue 3 的響應式系統(Reactivity System)
  • Vue 3 的 refreactive 在 setter 被觸發時,會先檢查 hasChanged(newValue, oldValue)
  • Vue 內部的 hasChanged 實作範例:
const hasChanged = (value, oldValue) => !Object.is(value, oldValue);

3. 不可變資料(Immutability)與物件/陣列比對
  • 補足 Object.is() 的侷限:說明 Object.is({}, {}) 依然是 false(因為記憶體位址不同)。
  • 帶出現代函式庫(如 Redux, Zustand)如何搭配 淺比對(Shallow Comparison)不可變更新 Pattern 來維護狀態。

四、 總結與開發者建議

  1. 業務邏輯(日常寫 Code):優先使用 ===,語法簡潔且涵蓋絕大多數情境。
  2. 底層封裝 / 狀態管理 / Custom Hooks:當需要寫通用工具函式(如比對 state 變化)時,改用 Object.is() 更加嚴謹。


上一篇
Day 1 | JavaScript 有哪些資料型別 (data types)? 如何辨別一個變數的資料型別?什麼時候又會自動轉換
下一篇
Day 3 閉包活多久-從debounce的timer看Environment-Record存活時間
系列文
現代函式庫與JavaScript的關係9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言