在 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); // 输出: 9007199254740992
console.log(num + 1); // 输出: 9007199254740992,精度丢失
const bigInt = 9007199254740992n;
console.log(bigInt); // 输出: 9007199254740992n
console.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 转换为 Number
const result2 = BigInt(num) + bigInt; // 将 Number 转换为 BigInt
console.log(result1); // 输出: 20
console.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
交互等方面的差异,确保代码的正确性和稳定性。