hand
_1_11_99
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 18:58:39
在 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
交互等方面的差异,确保代码的正确性和稳定性。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~