在 ES10 中,新增了一种基本数据类型:BigInt
类型。它可以表示任意大的整数,不受 JavaScript 中 Number
类型的精度限制。
BigInt 类型的定义
在 JavaScript 中,用 Number
类型表示的整数最大为 2^53 - 1
。如果超过这个范围,就会出现精度问题。例如:
console.log(9999999999999999); // 10000000000000000
因为本应该输出的是 9999999999999999
,而由于 Number
类型的精度问题,输出结果变成了 10000000000000000
。
为了解决这个问题,ES10 引入了 BigInt
类型。BigInt
类型是一种整数类型,表示任意大的整数。它以 n
结尾的数字字面量表示,例如:
const number = 1234567890123456789012345678901234567890n; console.log(typeof number); // "bigint"
BigInt 类型的运算
和 Number
类型一样,BigInt
类型也支持基本的数学运算和比较运算符。但需要注意,Number
类型和 BigInt
类型不能混合运算。例如:
const a = 123456789012345678901234567890n; const b = 1; console.log(a + b); // TypeError: Cannot mix BigInt and other types, use explicit conversions
需要使用 BigInt()
函数将 Number
类型转换成 BigInt
类型:
const a = 123456789012345678901234567890n; const b = BigInt(1); console.log(a + b); // 123456789012345678901234567891n
BigInt 类型的操作
BigInt
类型还支持一些与位运算相关的操作,例如左移、右移和按位非、按位与、按位或等操作。我们可以用这些操作实现一些高精度的运算。
例如,我们可以实现高精度加法和乘法:
// 高精度加法 function bigIntAdd(a, b) { const result = []; let carry = 0; for (let i = 1; i <= Math.max(a.length, b.length); i++) { const sum = (a[a.length - i] || 0n) + (b[b.length - i] || 0n) + carry; result.unshift(sum % 10n); carry = sum / 10n >> 0n; } if (carry) { result.unshift(carry); } return result.join('') + 'n'; } // 高精度乘法 function bigIntMultiply(a, b) { const result = []; for (let i = 0; i < a.length; i++) { let carry = 0n; for (let j = 0; j < b.length; j++) { const product = a[a.length - 1 - i] * b[b.length - 1 - j] + carry + (result[i + j] || 0n); result[i + j] = product % 10n; carry = product / 10n >> 0n; } if (carry) { result[i + b.length] = carry; } } return result.reverse().join('') + 'n'; } const a = 123456789012345678901234567890n; const b = 987654321098765432109876543210n; console.log(bigIntAdd(a, b)); // 1111111110111111111011111111100n console.log(bigIntMultiply(a, b)); // 121932631137021795295510913119027661917984929683609529835526729010n
BigInt 类型的应用
BigInt
类型可以解决一些高精度计算的问题,例如计算斐波那契数列:
function fibonacci(n) { let a = 0n, b = 1n; for (let i = 0; i < n; i++) { const t = b; b = a + b; a = t; } return a; } console.log(fibonacci(100)); // 354224848179261915075n
BigInt
类型还可以用于计算哈希值、加密等领域。
总结
BigInt
类型是 ES10 新增的一种基本数据类型,它可以表示任意大的整数。与 Number
类型相比,它的精度更高,也更适合一些高精度计算的场景。但需要注意,BigInt
类型和 Number
类型不能混合运算,需要使用 BigInt()
函数进行转换。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b75e10add4f0e0fffed760