Number构造函数按严格规则转换类型:字符串去空格后全匹配才转数,特殊值如true→1、null→0、undefined→NaN;对象先转原始值再转换;比parseInt更严格,但与一元加号行为一致。

Number构造函数在JavaScript中用于将其他类型转换为数值,它的转换逻辑并不只是简单“尝试变数字”,而是有一套明确的填充(coercion)规则,尤其在处理字符串、布尔值、null、undefined等类型时表现得尤为关键。
字符串转数字:严格解析,空格可忽略
当传入字符串时,Number会尝试解析其内容。开头和结尾的空白字符会被自动去除,然后按十进制规则解析。如果字符串为空、仅含空白,或包含无法解析的非数字字符(除开头的+/-和中间的小数点外),则返回NaN。
- "123" → 123
- " 45.6 " → 45.6
- "12a3" → NaN(遇到"a"停止解析,不取前面的12)
- "" 或 " " → 0(注意:这和parseInt("")不同,后者也返回NaN)
特殊原始值的固定映射
Number对几个基础原始值有预定义结果,不依赖内部算法,属于语言规范约定:
- true → 1
- false → 0
- null → 0
- undefined → NaN
- NaN → NaN(保持不变)
对象转数字:先转原始值再转换
若传入对象(包括数组、日期、普通对象等),Number会先调用该对象的valueOf()方法;若返回的不是原始值,则再调用toString(),最后将得到的字符串(或其它原始值)按前述规则转为数字。
立即学习“Java免费学习笔记(深入)”;
- Number([1,2]) → Number("1,2") → NaN
- Number([1]) → Number("1") → 1
- Number(new Date("2020-01-01")) → Number(1577836800000) → 1577836800000
- Number({}) → Number("[object Object]") → NaN
与一元加号(+)和parseInt/parseFloat的区别
Number() 和 + 运算符行为基本一致(都遵循相同的抽象操作 ToNumber),但比 parseInt 更严格:parseInt 会从头截取有效数字部分,而 Number 要求整个字符串可解析。
- Number("10px") → NaN|+"10px" → NaN|parseInt("10px") → 10
- Number("0x10") → 16(识别十六进制字面量)|parseInt("0x10") → 16(默认基数10下为0,需显式传16)
- Number("1e2") → 100|parseFloat("1e2") → 100|parseInt("1e2") → 1









