面试题:JavaScript 其他值到数字值的转换规则是什么?

在 JavaScript 中,将其他类型值转换为数字(Number)是一个常见的隐式或显式类型转换过程。理解其规则对于避免计算错误至关重要。

转换主要通过两种方式触发:

  1. 显式转换:使用 Number() 构造函数或一元加号 +
  2. 隐式转换:在数学运算(-, *, /, %)或比较(<, >, <=, >=)中自动发生。

一、转换规则总览

原始值转换结果说明
undefinedNaN未定义值无法表示为有效数字
null0特殊规则:null 转为 0
true1布尔 true 转为 1
false0布尔 false 转为 0
"" (空字符串)0空字符串转为 0
"123"123只包含数字的字符串可成功转换
" 123 "123会忽略首尾空白
"12.3"12.3支持小数
"0x10"16支持十六进制(0x 前缀)
"0o10"8支持八进制(0o 前缀)
"0b10"2支持二进制(0b 前缀)
"123abc"NaN包含非数字字符(除开头的 +/- 外)
"abc"NaN完全不是数字的字符串
[]0空数组先转为空字符串,再转为 0
[1]1单元素数组转为该元素的数字值
[1, 2]NaN多元素数组转为 "1,2",再转为 NaN
{}NaN对象调用 toString()"[object Object]",转为 NaN
function(){}NaN函数转为字符串后无法解析为数字

二、详细规则与示例

1. 原始类型转换

Number(undefined)  // NaN
Number(null)       // 0
Number(true)       // 1
Number(false)      // 0
Number("")         // 0
Number("  123  ")  // 123
Number("12.3")     // 12.3
Number("0x10")     // 16
Number("123abc")   // NaN
Number("abc")      // NaN

2. 对象转换(ToPrimitive → Number)

当对象需要转为数字时,JavaScript 会调用其 ToPrimitive 抽象操作,优先使用 valueOf(),如果 valueOf() 不返回原始值,则调用 toString()

const obj = {
  valueOf() { return 42; },
  toString() { return "hello"; }
};

Number(obj)  // 42 ← 优先 valueOf()

const obj2 = {
  valueOf() { return {}; }, // 不是原始值
  toString() { return "123"; }
};

Number(obj2) // 123 ← valueOf() 失败,使用 toString()

3. 数组转换

数组的 valueOf() 通常返回数组本身(不是原始值),所以会调用 toString()

  • []""0
  • [1]"1"1
  • [1, 2]"1,2"NaN
Number([])     // 0
Number([1])    // 1
Number([1,2])  // NaN

4. 一元加号 +

一元 + 是将值转换为数字的最短语法

+ "123"     // 123
+ true      // 1
+ null      // 0
+ []        // 0
+ [1]       // 1
+ {}        // NaN

三、数学运算中的隐式转换

+(非字符串拼接)、-, *, /, % 等运算中,操作数会被隐式转换为数字。

"10" - "5"     // 5 ← 字符串转数字
"10" * 2       // 20
"10" / "2"     // 5
"10" % 3       // 1

// 注意:+ 的歧义
"10" + 5       // "105" ← 字符串拼接
"10" - 5       // 5 ← 数值相减

四、比较运算中的转换

==<, >, <=, >= 比较中,如果两边类型不同,可能会触发数字转换。

"10" == 10     // true ← "10" 转为 10
"10" > 5       // true ← "10" 转为 10
null == 0      // false ← 特殊规则(虽然 Number(null) === 0)
null >= 0      // true ← null 转为 0 进行比较

五、如何安全地进行数字转换?

  1. 使用 Number()+:适用于需要精确转换的场景。
  2. 使用 parseInt() / parseFloat():适用于解析字符串,可指定进制。
    javascript parseInt("10px") // 10 ← 忽略非数字后缀 parseFloat("12.3cm") // 12.3
  3. 检查结果是否为 NaN
    javascript const num = Number(str); if (!isNaN(num)) { // 安全使用 num }

总结

类型转换为数字的关键规则
undefinedNaN
null0
布尔值true1, false0
字符串尝试解析数字,失败则 NaN;忽略空白;支持 0x, 0o, 0b
对象调用 valueOf()toString() 转为原始值,再转换
数组单元素数组可转,空数组为 0,多元素数组通常为 NaN

核心思想:JavaScript 的数字转换规则复杂,尤其在处理字符串和对象时容易出错。理解 ToPrimitive 机制和常见陷阱(如 []0),并善用 Number()parseInt()isNaN(),是确保数值计算正确的关键。

THE END
喜欢就支持一下吧
点赞7 分享