JS | undefined、null、NaN、0 到底是 true 還是 false?真假值與比較陷阱一次搞懂

更新 發佈閱讀 6 分鐘

JavaScript 的型別轉換可以說是初學者最常卡關的區域之一。特別是像 undefinednull0NaN 這些「看起來像沒東西」的值,常常讓人搞不清楚到底是 true 還是 false、該怎麼比較才不會掉進陷阱。

這篇文章我請 chatGPT 整理我在學習過程中最常混淆的幾個 JS 真假值與比較相關的觀念,希望也能幫助同樣在學習中的你和未來某天的自己。


以下內容整理自 chatGPT:


什麼是 Falsy 值?

在 JS 中,只要一個值在邏輯判斷中被當成「假」,就叫做 falsy。常見的 falsy 值有七個:

false
0
-0
0n // BigInt 的零
"" // 空字串
null
undefined
NaN

上面這些值如果放進 if 判斷中,會被當成「false」處理:

if (0) {
console.log("這不會執行");
}

if (null) {
console.log("這也不會執行");
}

所有其他的值(包含空陣列 []、空物件 {}、非空字串等等)都會被當作 truthy(真) 值。


undefined vs null 的差別?

undefined:系統自動給的「沒定義」預設值,例如變數還沒被賦值

null:開發者主動指定的「刻意沒有值」

let x;
console.log(x); // undefined

let y = null;
console.log(y); // null

兩者在邏輯判斷中都屬於 falsy,但在比較上會出現差異。


null == 0 為什麼是 false?

null == 0       // false ❗
null >= 0 // true 😵

null0== 比較時,不會被強制轉型成一樣的數字型別。

null >= 0 中,JS 把 null 當作 0 來做數值比較(這是個特例),所以結果是 true。但 null == 0 沒有這樣轉型邏輯,因此是 false。


null == undefined   // ✅ true
null === undefined // ❌ false (型別不同)

null 只有跟 undefined== 比較時才會返回 true:


這種模糊的行為就是為什麼只用嚴格比較 === 和 !==,不要用 ==


NaN:最詭異的數字

NaN(Not a Number)在 JS 中其實是一個「數字型別」,只是它表示「不是一個正常的數字」。最常見的例子就是:

console.log(0 / 0);   // NaN
console.log('abc' * 2); // NaN

❌ NaN ≠ NaN

最怪的是:NaN !== NaN,因為 NaN 連自己都不等於自己

console.log(NaN === NaN); // false ❗

所以如果你用 === 來檢查某個東西是不是 NaN,永遠都會得到錯誤結果。正確的方式是:


如何正確判斷 NaN?

有兩種方法:

isNaN("abc");         // true ❗(會先轉型)
Number.isNaN("abc"); // false ✅(不轉型)

方法 是否會轉型 結果

isNaN(value) ✅會 易誤判

Number.isNaN(value) ❌不會 最安全推薦使用 ✅

範例:

Number.isNaN(NaN)          // true
Number.isNaN(0 / 0) // true
Number.isNaN("abc") // false
Number.isNaN(undefined) // false

結論:判斷 NaN 用 Number.isNaN() 就對了。


0、""、false、null 的大小比較會怎樣?

這邊很容易出現陷阱,尤其是當你在做 >=< 等比較時:

console.log(null > 0);   // false
console.log(null == 0); // false
console.log(null >= 0); // true ❗

為什麼?因為比較運算子會強制轉型:

  • null >= 0 → 轉成 0 >= 0 → true
  • 但 null == 0 → 不做轉型 → false

同樣地:

undefined == 0     // false
undefined > 0 // false
undefined < 0 // false

因為 undefined 在數值比較時會變成 NaN,而 NaN 跟任何數比較都是 false。


統整

統整表格

統整表格


📌 建議的寫法

為了避免各種奇怪的轉型陷阱,強烈要記得:

  • ✅ 用 === 和 !==,不要用 ==
  • ✅ 判斷 NaN 用 Number.isNaN()
  • ✅ 不要假設 null、undefined、0 會有一致行為,確認型別才是王道
留言
avatar-img
msnigatsu
0會員
3內容數
🐱
你可能也想看
Thumbnail
建構函數是 JavaScript 中用來創建和初始化物件的一種特殊函數。它像一個「模具」,透過 new 關鍵字生成多個相似的物件實例。
Thumbnail
建構函數是 JavaScript 中用來創建和初始化物件的一種特殊函數。它像一個「模具」,透過 new 關鍵字生成多個相似的物件實例。
Thumbnail
什麼是提升?在 JavaScript 中,提升是指變數和函數宣告會在程式執行前被「提升」到它們所在作用域(scope)的頂部。這是 JavaScript 引擎處理程式碼時的一種行為,讓你在宣告之前就能使用某些變數或函數。
Thumbnail
什麼是提升?在 JavaScript 中,提升是指變數和函數宣告會在程式執行前被「提升」到它們所在作用域(scope)的頂部。這是 JavaScript 引擎處理程式碼時的一種行為,讓你在宣告之前就能使用某些變數或函數。
Thumbnail
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
Thumbnail
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
Thumbnail
for...of 需要迭代的是具有迭代器的可迭代物件。一般的物件,除非你為它定義迭代器,否則不能使用 for...of。它主要用來迭代「值」。 for...in 迭代的是物件的可枚舉屬性,在陣列中就會迭代索引。通常用來迭代物件屬性,在陣列中較不適合,也較容易出錯。
Thumbnail
for...of 需要迭代的是具有迭代器的可迭代物件。一般的物件,除非你為它定義迭代器,否則不能使用 for...of。它主要用來迭代「值」。 for...in 迭代的是物件的可枚舉屬性,在陣列中就會迭代索引。通常用來迭代物件屬性,在陣列中較不適合,也較容易出錯。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
瀏覽器中三種主要的客戶端儲存方式:Cookie、LocalStorage 和 SessionStorage。
Thumbnail
瀏覽器中三種主要的客戶端儲存方式:Cookie、LocalStorage 和 SessionStorage。
Thumbnail
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
Thumbnail
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
Thumbnail
在 JavaScript 中,變數是一個儲存值的容器,可用於管理和操作資料。變數可以透過 let、const 和 var 進行宣告。選擇適當的變數宣告方式是確保程式碼可讀性和可維護性的關鍵。
Thumbnail
在 JavaScript 中,變數是一個儲存值的容器,可用於管理和操作資料。變數可以透過 let、const 和 var 進行宣告。選擇適當的變數宣告方式是確保程式碼可讀性和可維護性的關鍵。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News