JavaScript 字符串转数字
我们知道 JavaScript 中字符串转为数字有 parseInt, Number(), + 等方式,但它们的转换规则很不一样适用范围也不同。比如 parseInt 可以解析数字字母的混合字符串而 Number 和 + 会直接产生 NaN,Number 和 parseInt 可以操作 BigInt 而 + 则会抛出 TypeError。TL;DR 三种字符串先给出对比表格如下:
| value | parseInt(value) | Number(value) | +value |
|---|---|---|---|
| "3.14"/3.14 | 3 | 3.14 | 3.14 |
| undefined | NaN | NaN | NaN |
| null | NaN | 0 | 0 |
| false | NaN | 0 | 0 |
| true | NaN | 1 | 1 |
| "Infinity"/Infinity | NaN | Infinity | Infinity |
| "1e3" | 1 | 1000 | 1000 |
| "123z" | 123 | NaN | NaN |
| "z123" | NaN | NaN | NaN |
| 10n | 10 | 10 | TypeError |
| "0x10" | 16 | 16 | 16 |
| "010" | 10 | 10 | 10* |
- parseInt 在某些浏览器下解释为 8 进制。
parseInt
parseInt 是从 ES1 开始就有的内置函数。第一个参数是数字字符串,第二个参数是进制,且只支持 2-36。对于 parseInt 的几点观察:
- 10 不是默认值。例如
parseInt('0x10')为 16,此时 parseInt 采取了 16 进制。 - 不是所有数字字符串都能 parseInt。parseInt 只认识 +/- 两种符号,因此
parseInt((1e80).toString())会从e截断结果为 1。如果要产生 parseInt 能识别的字符串,需要BigInt(1e80).toString()。 - 不是所有非数字都会返回
NaN。第一个字符不是数字时才返回NaN,例如parseInt('e3')为NaN,但parseInt('3e')为 3。
因此使用 parseInt 时建议遵守以下规则:
- 使用 parseInt 时应该指定进制。例如
parseInt('010')在有的浏览器中是 8 有的是 10,后来 ES5 规定了此时用 10。 - 推论:不能直接用于
Array.prototype.map,例如:
['10', '10', '10'].map(parseInt)
// 返回 [10, NaN, 2],因为进制参数分别为:0,1,2
Number
Number 是 "number" 基本类型的对象封装,不加 new 关键字时只做转换可以仍然返回基本类型。例如:
new Number('1') === 1 // false
Number('1') === 1 // true
用作类型转换时,Number 可以支持数字的所有字面表示比如 Number('1e3'), Number('Infinity'),Number('1.3'),但是不能自定义进制。此外不同于 parseInt 的是,Number 对任何不合法的数字表示都会返回 NaN。
+ 运算符
像多数语言一样 JavaScript 定义了 单目运算符 +,它的操作数可以是数字,也可以是其他类型。是其他类型时会被转换为数字。用于 BigInt 时会抛出 TypeError。
+val 是 JavaScript 中最常见的、最快的转换其他值到数字的方式,它不仅支持浮点数表示,还支持 8 进制和 16 进制,也能转换 null, false, true。转换失败时值为 NaN。和 Number 一样不会尝试转换字符串前缀为数字,只要整个字符串是非法的值就是 NaN。
需要注意的是 num + str 中的 + 是双目运算符 +,它不会把 str 转换为数字。如果这里要使用单目运算符 +,需要写成 num + +str。注意两个 + 要有空格,否则会解释为自增运算符进而抛出 SyntaxError。
但它的操作数可以是表达式,因此 num + + + + + str 也是合法的,也会把 str 转为数字。例如:
let num = 3, str = '3'
console.log(num + str) // '33'
console.log(num + + str) // 6
console.log(num + + + + + + str) // 6
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://www.harttle.com/2020/11/22/javascript-string-to-number.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。