在 JavaScript 中,数字类型代表着数值大小的限制。在 ES6 之前,数字类型被限制在 -2^53 ~ 2^53-1
的范围内,超出这个区间的值会导致精度误差和运算错误。这种限制对于某些场景下需要处理大数据的开发者来说,是一种瓶颈和困扰。而在 ES10 中,新增的 BigInt
类型带来了全新的思路和方法,让 JavaScript 可以处理任意大小的整型数据。本文将深入探讨 BigInt
类型的内部机制、应用场景和语法特点,以及给出实例代码进行演示和实践。
1. BigInt 是什么?
BigInt
是 JavaScript 中的一个新类型,它可以表示任意大小的整数。一个 BigInt
变量是一个整数,它可以是任何位数,而不受数字类型限制。这使得你能够使用 JavaScript 处理和操作超出数字类型范围的数字。
2. 如何使用 BigInt?
声明 BigInt
变量时,需要在整数后面添加一个 n
,表示这是一个 BigInt
类型的整数。如下所示:
const number = 999999999999999n; console.log(number); // 999999999999999n console.log(typeof number); // bigint
需要注意的是,BigInt
类型的变量和普通的数字类型是不能相互运算的。下面是一个错误的示例:
const a = 1; const b = 999999999999999n; console.log(a + b); // Uncaught TypeError: Cannot mix BigInt and other types
如果你要进行 BigInt
类型的运算,需要使用 BigInt()
方法将数字类型转换成 BigInt
类型,如下所示:
const a = 1; const b = BigInt(999999999999999); console.log(a + b); // 1000000000000000n
3. BigInt 实例和函数
在 ES10 中,为了使用 BigInt
更方便,提供了一系列的内置函数进行处理某些特定场景的操作。
3.1 BigInt 对象
BigInt 对象是在应用程序中直接操作 BigInt
的函数集。
BigInt.asIntN
BigInt.asIntN(width, bigint)
返回一个 BigInt
类型的整数,它的值等于给定整数 bigint
在 width
位二进制补码下表示的值。
const a = BigInt.asIntN(64, 999999999999999n); console.log(a); // 999999999999999n const b = BigInt.asIntN(32, -999999999999999n); console.log(b); // 232830271n
BigInt.asUintN
BigInt.asUintN(width, bigint)
返回一个 BigInt
类型的整数,它的值等于给定整数 bigint
在 width
位二进制无符号整数下表示的值。
const a = BigInt.asUintN(64, -999999999999999n); console.log(a); // 9000000000000000000n const b = BigInt.asUintN(32, 4294967295n); console.log(b); // 4294967295n
3.2 Math 对象
Math 对象是一组常见的数学计算函数。在 ES10 中,对于 BigInt
类型的数字,新增了一些针对性的函数。
Math.clz32
Math.clz32(x)
返回一个数字,在二进制表示中,有多少位是 0。
const a = BigInt(1); console.log(Math.clz32(a)); // 61 const b = BigInt(2); console.log(Math.clz32(b)); // 60
Math.imul
Math.imul(x, y)
返回两个参数的乘积,它们是 32 位带符号整数。结果也是一个 32 位带符号整数。
const a = BigInt(2147483647); const b = BigInt(2); console.log(Math.imul(a, b)); // -2
Math.max 和 Math.min
Math.max()
和 Math.min()
方法通过比较参数的值来获取最大值或最小值。对于 BigInt
,使用 BigInt.compare()
进行比较,再取出最大或最小值。
const a = BigInt(2); const b = BigInt(100); const c = BigInt(50); console.log(Math.max(a, b, c)); // 100n console.log(Math.min(a, b, c)); // 2n
4. BigInt 应用举例
BigInt
类型可以应用于各种常见的场景,比如计数器、加密、哈希、通信协议等。下面举例说明两个案例。
4.1 斐波那契数列
如下所示是一个斐波那契数列的计算函数,其中使用了 BigInt()
对象,无需再次声明开辟变量空间,可以直接进行任意长度和精度的斐波那契数列计算。
function fibonacci(n) { let fib = [BigInt(0), BigInt(1)]; for(let i = 2; i <= n; i++){ fib[i] = BigInt(fib[i-1]) + BigInt(fib[i-2]); } return fib[n]; } console.log(fibonacci(100)); // 573147844013817084101
4.2 大数字加法
如下所示是一个大数字加法计算函数,其中使用了 BigInt()
对象,可以轻松处理较大位数的数字加法,并输出结果。
function addBigNumber(a, b) { let ans = '', cur = 0; let lenA = a.length, lenB = b.length; let minLen = Math.min(lenA, lenB); for(let i = 0; i < minLen; i++){ cur += Number(a[lenA - 1 - i]) + Number(b[lenB - 1 - i]); ans = cur % 10 + ans; cur = cur > 9 ? 1 : 0; } let remain = lenA > lenB ? a : b; for(let j = minLen; j < Math.max(lenA, lenB); j++){ cur += Number(remain[Math.max(lenA, lenB) - 1 - j]); ans = cur % 10 + ans; cur = cur > 9 ? 1 : 0; } if(cur === 1) ans = '1' + ans; return BigInt(ans); } const a = BigInt(9999999999999999999999999999999999999999999999999999999999999999999999999); const b = BigInt(1); console.log(addBigNumber(a,b)); // 10000000000000000000000000000000000000000000000000000000000000000000000000000n
5. 总结
ES10 中的 BigInt
类型为 JavaScript 带来了更加宽泛的数值表示范围,解决了数字类型无法处理大数据的问题。通过本文的介绍,我们可以掌握 BigInt
的基本语法和细节注意事项,进而可以运用到实际项目中的场景中。作为前端开发者,在面对超出数字类型范围的数据时,应当灵活采用 BigInt
类型,并结合内置函数和业务场景,实现更加全面和高效的数据处理。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a8e8d8add4f0e0ff22a157