在 JavaScript 中,並不是所有「看起來像假」的值都會被判斷為 false。-1 就是一個常見的陷阱。
問題示範
1
2
3
4
|
var a = -1;
if (a) {
console.log('hello world'); // 這行會執行!
}
|
-1 在 if 條件中被判斷為 truthy(真值),所以 hello world 會被印出。
JavaScript 的 Falsy 值
在 JavaScript 中,以下 7 個值會被判斷為 false:
1
2
3
4
5
6
7
8
|
false // 布林值 false
0 // 數字零
-0 // 負零
0n // BigInt 零
"" // 空字串(單引號或雙引號都算)
null // null
undefined // undefined
NaN // Not a Number
|
Truthy 值(容易誤解的部分)
除了上述 falsy 值以外,其他所有值都是 truthy,包括以下容易被誤解的情況:
1
2
3
4
5
6
|
if (-1) // ✅ truthy(非零數字)
if ("0") // ✅ truthy(非空字串,即使內容是 "0")
if ("false") // ✅ truthy(非空字串)
if ([]) // ✅ truthy(空陣列)
if ({}) // ✅ truthy(空物件)
if (function(){}) // ✅ truthy(函式)
|
常見陷阱與最佳實踐
陷阱 1:用 indexOf 判斷是否找到元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// ❌ 錯誤寫法:找不到時回傳 -1,但 -1 是 truthy!
var arr = [1, 2, 3];
if (arr.indexOf(4)) {
console.log('找到了'); // 即使找不到也會執行!
}
// ✅ 正確寫法
if (arr.indexOf(4) !== -1) {
console.log('找到了');
}
// ✅ 更現代的寫法
if (arr.includes(4)) {
console.log('找到了');
}
|
陷阱 2:空陣列的判斷
1
2
3
4
5
6
7
8
9
|
// ❌ 意圖判斷陣列是否有元素,但空陣列也是 truthy
if ([]) {
console.log('有元素?'); // 永遠執行!
}
// ✅ 正確寫法
if (arr.length > 0) {
console.log('有元素');
}
|
陷阱 3:字串 “0” 的判斷
1
2
3
4
5
6
7
8
9
|
var str = "0";
if (str) {
console.log('非空字串,執行'); // 會執行!
}
// 若要判斷數值是否為 0
if (Number(str) === 0) {
console.log('數值為 0');
}
|
嚴格比較 vs 寬鬆比較
養成習慣使用 ===(嚴格相等)而非 ==,可以避免大多數 Truthy/Falsy 相關問題:
1
2
3
4
|
0 == false // true(寬鬆比較,有型別轉換)
0 === false // false(嚴格比較,型別不同)
"" == false // true
"" === false // false
|
參考資料