Contents

[javascript]if(-1) 結果

在 JavaScript 中,並不是所有「看起來像假」的值都會被判斷為 false-1 就是一個常見的陷阱。

問題示範

1
2
3
4
var a = -1;
if (a) {
  console.log('hello world'); // 這行會執行!
}

-1if 條件中被判斷為 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

參考資料