js 的 BigInt 和 Number 类型有什么区别?
文章类型:Javascript
发布者:hp
发布时间:2025-02-22
BigInt是ES6之后引入的,用来表示大于2^53-1的整数,而Number是传统的数值类型,包括整数和浮点数。
首先,存储范围应该是一个区别,Number的最大安全整数是2^53-1,而BigInt可以表示更大的整数,没有上限
(1)类型标识上
BigInt=>typeof 123n → "bigint"
Number=>typeof 123 → "number"
(2)数值范围上
BigInt=>无上限(任意精度整数)
Number=>±(2^53 - 1)
(3)字面量写法上
BigInt=>以 n 结尾(如 123n)
Number=>普通数字(如 123、3.14)
(4)JSON序列化上
BigInt=>需手动转换
Number=>原生支持
(5)数学运算兼容性
BigInt=>不可与Number婚后运算
Number=>通用
(6)全局方法支持
BigInt=>不支持Math
Number=>支持
1:BigInt 在内存中以类似字符串的“分段”方式存储,避免溢出
2:Number 的 64 位双精度浮点格式中,1 位符号位 + 11 位指数 + 52 位尾数,导致大整数精度丢失
1:BigInt适用于超出Number安全整数范围的计算
2:Number适用于常规数值计算
// 大数计算(Number 溢出)
const maxSafe = 9007199254740991;
console.log(maxSafe + 2); // → 9007199254740992(精度错误)
// BigInt 正确处理
const bigIntVal = 9007199254740991n;
console.log(bigIntVal + 2n); // → 9007199254740993n(精确)
//除法
5n / 2n → 2n // 舍弃小数(返回整数)
5 / 2 → 2.5 // 保留小数
//比较
10n == 10 → true // 宽松相等
10n === 10 → false // 严格类型不等
//类型转换
Number(9007199254740993n) → 9007199254740992 // 精度丢失
BigInt(1.5) → 报错(仅支持整数)
1:BigInt适用于超大整数,Number适用于常规数值
2:BigInt 为任意精度整数,Number 为双精度浮点数