
在 JavaScript 的世界里,数值的处理是日常开发中不可或缺的一部分。通常情况下,我们使用普通的 Number 类型来处理数值,但当遇到非常大的整数时,Number 类型就显得力不从心了。这时,ES2020 引入的 BigInt 对象就派上了用场。本文将详细探讨大整数(BigInt)与普通数值(Number)的区别。
在 JavaScript 中,Number 类型是基于 IEEE 754 双精度 64 位浮点数标准实现的。这意味着它可以表示的数值范围是有限的,其安全整数范围是 -(2^53 - 1) 到 2^53 - 1,即 -9007199254740991 到 9007199254740991。超出这个范围,数值的精度就会受到影响。
BigInt 是一种新的数值类型,用于表示任意大的整数。你可以通过在整数后面添加 n 或者使用 BigInt() 构造函数来创建 BigInt 类型的值。BigInt 可以处理任意大的整数,不受 Number 类型安全整数范围的限制。
| 类型 | 表示范围 | 示例 |
|---|---|---|
| Number | -(2^53 - 1) 到 2^53 - 1 |
const num = 9007199254740991; |
| BigInt | 任意大的整数 | const bigInt = 9007199254740992n; |
下面的代码展示了 Number 类型超出安全整数范围时的精度问题:
const num = 9007199254740992;console.log(num); // 输出: 9007199254740992console.log(num + 1); // 输出: 9007199254740992,精度丢失const bigInt = 9007199254740992n;console.log(bigInt); // 输出: 9007199254740992nconsole.log(bigInt + 1n); // 输出: 9007199254740993n,结果正确
可以使用 typeof 运算符来判断一个值的类型:
const num = 10;const bigInt = 10n;console.log(typeof num); // 输出: "number"console.log(typeof bigInt); // 输出: "bigint"
BigInt 和 Number 不能直接进行混合运算,否则会抛出 TypeError 错误。需要将它们转换为相同的类型后再进行运算。
const num = 10;const bigInt = 10n;// 以下代码会抛出 TypeError// const result = num + bigInt;// 正确的做法是将它们转换为相同的类型const result1 = num + Number(bigInt); // 将 BigInt 转换为 Numberconst result2 = BigInt(num) + bigInt; // 将 Number 转换为 BigIntconsole.log(result1); // 输出: 20console.log(result2); // 输出: 20n
Number 类型有一些内置的方法和属性,如 toFixed()、isNaN() 等,而 BigInt 类型也有自己的一些方法,如 toString()。但它们的方法和属性并不完全相同。
const num = 10.25;const bigInt = 10n;console.log(num.toFixed(1)); // 输出: "10.2"console.log(bigInt.toString()); // 输出: "10"
JSON 不支持直接序列化 BigInt 类型的值。如果尝试将包含 BigInt 的对象进行 JSON.stringify() 操作,会抛出 TypeError 错误。
const obj = {bigInt: 10n};// 以下代码会抛出 TypeError// const jsonStr = JSON.stringify(obj);// 可以自定义转换函数来处理const jsonStr = JSON.stringify(obj, (key, value) => {return typeof value === 'bigint'? value.toString() : value;});console.log(jsonStr); // 输出: '{"bigInt": "10"}'
BigInt 对象为 JavaScript 带来了处理任意大整数的能力,弥补了 Number 类型在表示范围上的不足。在实际开发中,我们需要根据具体的需求选择合适的数值类型,避免因数值范围和精度问题导致的错误。同时,要注意 BigInt 和 Number 在运算规则、与 JSON 交互等方面的差异,确保代码的正确性和稳定性。