number()对含字母字符串仅在合法数值格式(如科学计数法、十六进制、空格包裹数字)下返回有效数,其余情况一律返回nan;其全匹配特性区别于parseint/parsefloat的左端宽松解析。

Number() 遇到含字母的字符串时,只要不是纯数字格式(或合法的科学计数法、空格包裹的数字),一律返回 NaN。
哪些情况会得到 NaN
只要字符串中存在任何非数字字符(除开头/结尾的空白、正负号、小数点、e/E 指数符号外),且这些字符的位置或组合不构成合法数值格式,Number() 就无法解析,返回 NaN:
-
Number("123abc")→NaN(字母出现在数字后) -
Number("abc123")→NaN(以字母开头) -
Number("12.34.56")→NaN(多个小数点) -
Number("12e3e4")→NaN(非法指数格式) -
Number(" 42px ")→NaN("px" 不是可忽略的单位)
哪些情况仍能成功转换
看似“带字母”,但符合 JavaScript 数值字面量规则的极少数形式可以解析:
-
Number("123e-2")→1.23(合法科学计数法) -
Number(" +0x1F ")→31(开头空格 + 合法十六进制,注意:仅限0x开头) -
Number(" -0XABC ")→-2748(大小写不敏感的十六进制) -
Number("")→0(空字符串) -
Number(" 42 ")→42(纯空格包裹的数字)
和 parseInt / parseFloat 的关键区别
Number() 是“全匹配”:必须整个字符串都表示一个有效数值;而 parseInt 和 parseFloat 是“从左开始尽可能解析”:
-
Number("42px")→NaN -
parseInt("42px")→42(停在 'p' 前) -
parseFloat("3.14abc")→3.14(停在 'a' 前)
安全使用的建议
若需处理可能含非数字字符的输入(如 CSS 值、用户输入),不要依赖 Number() 直接转换:
- 先用正则提取数字部分,再转:
Number("100px".match(/^\s*([-+]?\d*\.?\d+(?:[eE][-+]?\d+)?)\s*/)[1]) - 用
parseFloat()更宽容,但需注意它会忽略尾部非数字内容 - 转换后务必检查:
const n = Number(str); if (isNaN(n)) { /* 处理错误 */ } - 避免用
==或===直接比较NaN,要用isNaN(n)或Number.isNaN(n)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











