Number(value)那些眉角

在 JavaScript 中,Number(value) 常被拿來驗證數字的型別,它會嘗試將 value 轉換為數字,可能會發生以下幾種情況:


1. 數字類型 (number)

如果 value 本身是數字,則 Number(value) 會回傳該數字

console.log(Number(42));    // 42
console.log(Number(-3.14)); // -3.14
console.log(Number(0));     // 0

2. 數字型字串 (string)

如果 value 是「數字格式的字串」,會成功轉換為數字

console.log(Number("42"));    // 42
console.log(Number("3.14"));  // 3.14
console.log(Number("-100"));  // -100
console.log(Number("0"));     // 0
console.log(Number("  123 "));// 123 (前後空格會被忽略)

注意:包含非數字的字串(例如 "42px")不會被正確轉換(見情況 5)。


3. null

null 會轉換為 0

console.log(Number(null)); // 0

4. true 和 false

布林值 true 轉換為 1false 轉換為 0

console.log(Number(true));  // 1
console.log(Number(false)); // 0

5. 非數字字串 (string,但非數字格式)

如果 value 是非數字的字串,會回傳 NaN

console.log(Number("hello"));    // NaN
console.log(Number("123abc"));   // NaN
console.log(Number("42px"));     // NaN
console.log(Number(""));         // 0 (特殊情況)
console.log(Number(" "));        // 0 (特殊情況)

注意:

  • 空字串 ("") 或 只含空格的字串 (" ") 會轉換為 0
  • 任何包含非數字字元(如 "42px""abc")都會變 NaN

6. undefined

undefined 會轉換為 NaN


console.log(Number(undefined)); // NaN


7. NaN

NaN 仍然是 NaN(不是數字)

console.log(Number(NaN)); // NaN

8. Infinity 和 Infinity

Infinity-Infinity 會保持不變

onsole.log(Number(Infinity));  // Infinity
console.log(Number(-Infinity)); // -Infinity

9. 物件 (object)

物件無法轉換,會回傳 NaN

console.log(Number({}));       // NaN
console.log(Number({a: 10}));  // NaN
console.log(Number([]));       // 0  (特殊情況)
console.log(Number([99]));     // 99 (單個數字的陣列會轉換)
console.log(Number([1, 2]));   // NaN (多個元素的陣列不會轉換)

特殊例外

  • 空陣列 [] 轉換為 0
  • 單個數字的陣列 [99] 轉換為 99
  • 多個元素的陣列 [1,2] 轉換為 NaN

總結

類型測試值轉換結果 (Number(value))
數字4242
數字字串"3.14"3.14
布林值true1
false0
nullnull0
undefinedundefinedNaN
空字串""0
空白字串" "0
非數字字串"abc"NaN
"42px"NaN
物件{}NaN
陣列[]0
[99]99
[1, 2]NaN

結論

  • 數字 & 數字字串 可以成功轉換
  • null0true/false1/0
  • undefined、非數字字串、物件 變 NaN
  • 空字串 & 空白字串0
  • 空陣列變 0,單個數字陣列變該數字,多個數字陣列變 NaN

這就是 Number(value1) 可能發生的情況。