ECMAScript 2020 中的 BigInt——JavaScript 的超级大数
ECMAScript 2020 中的 BigInt 是一种新型数据类型,用于存储在 JavaScript 中无法表示的整数。在 JavaScript 中,常规数字(Double)的范围是从-253到+253,然而 BigInt 允许你使用非常大的整数,甚至超过了 2**53 的范围。这个新的数据类型是通过在数字末尾添加 N 或 n 即可创建的。例如:
const num = 1234567890123456789012345678901234567890n;
不必担心 BigInt 数字过大,无法进行算术运算。因为 BigInt 已经被升级为正式内置类型,并且注意,使用 BigInt 能够提供良好的性能。事实上,BigInt 的固定长度、支持简单的算术运算等特征使得其具有更高的性能,因为当数字太大时,其速度会比常规数字快。考虑以下代码:
console.time("test") for(let i = 0; i < 1000000; i++){ let x = i * i; } console.timeEnd("test")
虽然代码很简单,但我们可以将它改造成更加严格的运算,以使其超过常规数字的整数范围:
console.time("test") for(let i = 0n; i < 1000000n; i++){ let x = i * i; } console.timeEnd("test")
这里的代码使用 BigInt 类型避免了溢出,而且执行速度更快而且更稳定。
另外,如果需要将普通数字转换成 BigInt,可以使用 toString() 函数重新构造这个数字:
const regularNumber = 15925; const bigIntNumber = BigInt(regularNumber.toString());
如果需要将 BigInt 数字转换成普通数字,可以使用 Number() 函数:
const bigIntNumber = 39248347382920n; const regularNumber = Number(bigIntNumber);
不过需要注意的是,这个过程是基于科学计数法的,当前执行的数字仅仅是一个四舍五入的值。实际上在执行这段代码时,已经发现它不能正确处理 16 位以上的任何数字。如果需要处理更大范围的整数,还是需要使用 BigInt。
在 BigInt 中,使用 +、-、、/、%、* 和其他运算符,包括位级运算符(如 >>、<<、&、| 和 ^)和比较运算符。但是需要注意的是,如果试图通过混合 BigInt 和普通数字的运算表达式,将会导致异常。
BigInt 变量也可以参与模运算,但是需要特别注意的是,当模数为负数时,可保证 BigInt 模运算将产生定义良好的结果。
BigInt 还支持 bitwise shift 运算符:
let n = 12n; //二进制:1100 console.log(n<<1n); //二进制:11000, 十进制:24 console.log(n>>1n); //二进制:110,十进制:6 console.log(n & 3n); // 十进制 0。 console.log(n | 4n); // 十进制:14。 console.log(n ^ 4n); // 十进制:8。 console.log(~n); // 十进制 -n-1: -13 。
BigInt 数字也支持如 toLocaleString()、toString()、valueOf() 等方法,和普通数字类型一样。
ECMAScript 2020 中的 BigInt 对于那些需要处理超出 JavaScript Number 范围很大的数字的人来说,是一项非常有用的特性。这种情况往往是在处理密码或其他加密方法时比较常见的。其总结如下:
- BigInt 是一种专门设计用来表示超大数字的新的数据类型。
- BigInt 性能优异并能够很好地进行运算。
- 在常规数字和 BIgInt 之间进行算术运算时需要注意类型不一致的可能导致的错误。
- 任何需要超出常规数值范围的操作均应考虑使用 BigInt 变量。
在实际开发过程中,通过 BigInt 类型可以更好地处理需要大量超出 Number 范围数字的问题,因此对开发人员来说是非常重要的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649fcdc748841e9894c29220