在前端开发中,我们常常需要使用数字来进行计算或者表示。然而,普通数字的表示范围是有限的,当需要处理的数字超出了这个范围,就无法进行准确的计算或者表示。为了解决这个问题,ECMAScript 10(简称 ES10)引入了一种新的数字类型——BigInt。
BigInt 是什么
BigInt 是一种表示任意精度整数的数据类型,可以表示比 JavaScript 中 Number 类型更大的整数。在传统的 JavaScript 中,Number 类型的整数最大值为 2^53 -1,任何超出这个值的整数将被舍入为最接近的整数。而 BigInt 可以表示和操作任意大小的整数,不会有精度问题。
BigInt 类型的数字以 n 结尾,例如:12345678901234567890n
。
如何使用 BigInt
在处理超出普通数字范围的需求时,可以将数字字面量后面添加 n,来表示一个 BigInt 类型的数字。
const bigNum = 1234567890123456789012345678901234567890n;
也可以通过 BigInt() 构造函数,将一个普通数字转换为 BigInt 类型的数字。
const normalNum = 123456789012345678901234567890; const bigNum = BigInt(normalNum);
在进行计算时,只能同时操作 BigInt 类型的数字,不能和普通数字进行混合运算。如果需要和普通数字进行运算,需要将普通数字转换为 BigInt 类型的数字。
const normalNum = 123456789012345678901234567890; const bigNum = 1234567890123456789012345678901234567890n; //将普通数字转换为 BigInt 类型的数字 const sum = BigInt(normalNum) + bigNum;
BigInt 的操作
BigInt 的操作和普通数字类似,支持加、减、乘、除等常见的运算符号。此外,还有位运算符号(异或、或、与、非、左移、右移),以及比较运算符号(大于、小于、等于、不等于)。
// javascriptcn.com 代码示例 const a = 123456789012345678901234567890; const b = 987654321098765432109876543210; const bigA = BigInt(a); const bigB = 98765432109876543210n; console.log(bigA + bigB); //输出:123456789012345678901233333333100 console.log(bigA - bigB); //输出:123456789012345678901236802469880 console.log(bigA * bigB); //输出:12193263113702153533090407008071782816297923854598540 console.log(bigA / bigB); //输出:1247n console.log(bigA % bigB); //输出:12678592257671792170n console.log(bigA ^ bigB); //输出:123456789012345681113208379524 console.log(bigA | bigB); //输出:126447049103736931603564390350 console.log(bigA & bigB); //输出:92696106988307380163161533586 console.log(~bigA); //输出:-123456789012345678901234567891n console.log(bigA << 3); //输出:987654312345678901234567890000n console.log(bigB >> 3); //输出:12258064823743395276n console.log(bigA > bigB); //输出:false console.log(bigA < bigB); //输出:true console.log(bigA === bigB); //输出:false console.log(bigA !== bigB); //输出:true
BigInt 的限制
尽管 BigInt 的表示范围非常广阔,但是在实际使用中还是存在一些限制。
首先,BigInt 不能使用具有 Number 类型的参数或者返回值的数学函数,例如 Math.sqrt()、Math.pow() 等函数都不能接受或返回 BigInt 类型的数字。
其次,与普通数字不同,BigInt 类型的数字不能用作对象属性名或数组索引。
最后,由于 BigInt 的操作比普通数字复杂得多,因此其性能会比普通数字低很多。除非确实需要处理超出普通数字范围的需求,否则不建议滥用 BigInt。
总结
ES10 中引入的 BigInt 类型,可以解决超出普通数字范围的需求。通过将数字字面量后面添加 n 或者使用 BigInt() 构造函数,可以将普通数字转换为 BigInt 类型的数字。与普通数字不同的是,BigInt 类型的数字不能用作对象属性名或者数组索引,并且不能直接与普通数字进行运算。因此,在使用 BigInt 时需要注意这些限制,避免影响程序的性能和正确性。
参考文献
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6540cd947d4982a6eba5dc4f