JavaScript 的型別轉換可以說是初學者最常卡關的區域之一。特別是像 undefined、null、0、NaN 這些「看起來像沒東西」的值,常常讓人搞不清楚到底是 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 😵
null 跟 0 用 == 比較時,不會被強制轉型成一樣的數字型別。
但 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 會有一致行為,確認型別才是王道








