number构造函数用于类型转换,空字符串转0,布尔值true/false转1/0,null转0、undefined转nan,对象先调用tostring再解析,symbol和bigint抛typeerror。

Number构造函数在JavaScript中用于将其他类型值转换为数字,其行为与Number()函数一致(不带new时是类型转换,带new时创建包装对象,但日常转换场景几乎只用函数调用形式)。它有一套明确但容易混淆的转换逻辑,核心原则是:尝试解析为有效数字,失败则返回NaN,空字符串和布尔值有特殊处理。
字符串转数字的规则
字符串会先去除首尾空白,再按数值格式解析:
- 空字符串
""→0(这是唯一一个非数字字符串转成0的例外) -
"123"、"-45.6"、" 789 "→ 对应数字123、-45.6、789 -
"0x1F"(十六进制)、"0o77"(八进制)、"0b101"(二进制)→ 分别转为十进制整数31、63、5(仅在严格格式下支持,如无前缀或含非法字符则返回NaN) -
"123abc"、" 45.6.7 "、"Infinity"(注意:不是小写)→ 全部返回NaN(不识别Infinity或NaN字面量,也不做截断)
布尔值、null、undefined的固定映射
这些原始值的转换结果是硬编码的,不依赖解析逻辑:
-
true→1 -
false→0 -
null→0 -
undefined→NaN
对象(包括数组、日期等)的转换流程
对对象调用Number()时,会先调用obj.toString(),再对结果字符串执行上述字符串转换规则:
-
Number([1, 2])→[1, 2].toString()得"1,2"→ 解析失败 →NaN -
Number([42])→"42"→42 -
Number([])→"".toString()得""→0 -
Number(new Date("2020-01-01"))→ 调用toString()得类似"Wed Jan 01 2020 00:00:00 GMT+0800 (...)"→ 解析失败 →NaN;但Number(new Date(2020,0,1))会先调用valueOf()(若存在且为原始值),而Date.prototype.valueOf()返回时间戳数字,所以结果是1577808000000
Symbol和BigInt的限制
这两类值无法被Number()转换,直接抛出TypeError:
-
Number(Symbol("a"))→ 报错:TypeError: Cannot convert a Symbol value to a number -
Number(1n)→ 报错:TypeError: Cannot convert a BigInt value to a number(需显式用BigInt.asIntN()或asUintN()配合转换)
掌握这些规则能避免隐式转换陷阱,比如Number([])得0、Number([0])也得0,但Number([0, 0])却是NaN。实际开发中建议优先使用parseInt/parseFloat处理字符串,或用typeof x === 'string' && x.trim() !== ''做前置校验,减少意外NaN。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











