在前端开发中,我们常常需要进行字符串转换成数字的操作。然而,由于 JavaScript 中的弱类型特性,字符串转换成数字的方式并不总是一致,这会导致一些意想不到的结果。在 ES11 中,JavaScript 引入了一种新的方式来解决字符串转换成数字的问题,在这篇文章中将会详细介绍这种新的方式,同时给出实际的例子以便读者理解。
背景
在 JavaScript 中,我们可以使用 parseInt()
或者 Number()
来将字符串转换成数字。例如,
const num1 = parseInt("123"); const num2 = Number("123");
这两个方法看起来类似,但实际上有一些区别。
parseInt() vs. Number()
parseInt()
方法将字符串转换成整数,并且可以通过传递第二个参数来指定进制数。例如,
const num1 = parseInt("10", 2); // 将二进制数10转换成十进制数 const num2 = parseInt("10", 8); // 将八进制数10转换成十进制数 const num3 = parseInt("10", 10); // 将十进制数10转换成十进制数 const num4 = parseInt("10", 16); // 将十六进制数10转换成十进制数
但是,当传递一个无法解析为数字的字符串时,parseInt()
方法会返回 NaN
。例如,
const num5 = parseInt("Hello, world!"); // 返回 NaN
另一方面,Number()
方法将字符串转换成数字,当传递一个无法解析为数字的字符串时,会返回 NaN
。例如,
const num6 = Number("123"); // 返回 123 const num7 = Number("Hello, world!"); // 返回 NaN
异常情况
除了 NaN
,当字符串表示的数字超出了 JavaScript 数字类型所能表示的最大或最小值时,将会出现一些异常情况。
parseInt() 的异常情况
当 parseInt()
转换出的值超出了 JavaScript 数字类型所能表示的最大或最小值时,会出现一些意外的结果。例如,
const num8 = parseInt("9007199254740992"); // 返回 9007199254740991 const num9 = parseInt("-9007199254740992"); // 返回 -9007199254740992,这里的负号不会影响结果
为什么 parseInt("9007199254740992")
返回的是 9007199254740991
呢?这是因为 9007199254740992
已经超过了 JavaScript 中 Number.MAX_SAFE_INTEGER
所表示的最大值,因此 parseInt()
被强制转换为使用 64 位带符号整数进行操作。而在 64 位带符号整数中,最大可以表示的数值是 2^63-1
,也就是 9007199254740991
。同样地,parseInt("-9007199254740992")
返回的是最小的 JavaScript 数字值 -9007199254740992
。
Number() 的异常情况
当 Number()
转换出的值超出了 JavaScript 数字类型所能表示的最大或最小值时,将会返回正无穷或负无穷。例如,
const num10 = Number("1e309"); // 返回 Infinity const num11 = Number("-1e309"); // 返回 -Infinity
ES11 中的新方式
在 ES11 中,JavaScript 引入了一种新的方式来解决字符串转换成数字的问题,它就是 BigInt()
。BigInt()
方法将字符串转换成 BigInt 类型的数字。例如,
const num12 = BigInt("9007199254740992"); // 返回 9007199254740992n
注意到 BigInt()
方法在字符串后面加上 n
,这代表着它是一个 BigInt 类型的数字。BigInt()
可以处理 JavaScript 中 Number.MAX_SAFE_INTEGER
和 Number.MIN_SAFE_INTEGER
所不能表示的大整数。例如,
const huge_int = BigInt("10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); // 可以处理这样的大数字
此外,BigInt()
方法还能够处理科学计数法表示的大数字。例如,
const num13 = BigInt("1e10000"); // 可以处理这样的科学计数法表示的大数字
但是需要注意的是,BigInt()
方法只能处理整数类型的数字。如果传递一个小数类型的数字,将会出现错误。例如,
const num14 = BigInt("3.1415926"); // 报错
总结
在 JavaScript 中进行字符串转换成数字的操作是很常见的,但在弱类型的 JavaScript 中,这会导致一些意想不到的错误。在 ES11 中,JavaScript 引入了一种新的方式,即 BigInt()
方法,它可以处理 JavaScript 中 Number.MAX_SAFE_INTEGER
和 Number.MIN_SAFE_INTEGER
所不能处理的大整数。但是需要注意的是,BigInt()
方法只能处理整数类型的数字。在实际开发中,我们应该根据实际情况选择合适的方法进行字符串转换成数字的操作,避免出现意想不到的结果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/664f03cdd3423812e4fe0d67