在 JavaScript 中,Number 类型可以处理数字,但是当数字超过2的53次方时,它可能会失真,这对于处理大整数是一个灾难。在此之前,我们需要借助一些库来处理大整数。然而,ES12 引入了 BigInt 类型,这是原生支持大整数的新类型,它让处理大整数变得非常简单。
什么是 BigInt?
BigInt 是 JavaScript 中的新内置类型,可以用来表示更大的整数。由于其产生的原因,BigInt 在处理数字的过程中是精准的,不会有失真的情况。BigInt 类型可以存储任意大小的整数,并且速度与原生数字一样快,并且可以使用现有的数字算法库中提供的各种方法进行计算。
如何使用 BigInt?
BigInt 可以直接使用关键字“n”创建:
const maxInt = 9007199254740991n;
注意:在数字后面添加字母“n”将其表示为 BigInt 类型。
也可以使用 BigInt() 方法将数字转换为 BigInt 类型:
const maxInt = BigInt(9007199254740991);
从 BigInt 的值中提取数字可以使用 toLocaleString() 或 toString() 方法:
const maxInt = 9007199254740991n; console.log(maxInt.toLocaleString()); // 9,007,199,254,740,991 console.log(maxInt.toString()); // 9007199254740991
可以将 BigInt 类型与原生数字类型进行混合使用:
const myInt = 10n; const myDouble = 10.5; console.log(myInt + BigInt(myDouble)); // 20n
BigInt 与原生数字
两种类型之间可以进行简单的计算。这是通过在运算符后面添加“n”来完成的,如下例所示:
const myInt = 10n; const myDouble = 10.5; console.log(myInt + BigInt(myDouble)); // 20n
但是,使用原生的数字运算符时,BigInt 类型和原生数字类型是不能互相转换的:
const myInt = 10n; const myDouble = 10.5; const result = myInt + myDouble; // SyntaxError: Cannot mix BigInt and other types
支持 BigInt 的函数
由于 BigInt 与 Number 有所不同,我们不能在 BigInt 上使用现有的数字函数,因为这些函数不支持 BigInt 类型。因此,在处理 BigInt 的过程中,不得不使用新函数。在 ES2020 中,新增了以下几个重要的 BigInt 函数:
1. BigInt.asUintN()
将任意数字转换成一个固定范围内的一个整数。如果给定的数字不在指定的范围内,函数会是将其变为一个“循环整数”。
console.log(BigInt.asUintN(8, -14n)); // 242n
2. BigInt.asIntN()
将一个 BigInt 类型的值转换为固定范围内的一个整数。
console.log(BigInt.asIntN(10, 12345678901234567890n)); // -730108416n
3. BigInt.asString()
BigInt 类型的值转换为另一种进制表示。
console.log(BigInt.asString(100n, 16)); // "64" console.log(BigInt.asString(100n, 2)); // "1100100"
建议
使用 BigInt 可以在处理很大的数字时免去使用库的麻烦。这只是 ES2020 可用的新功能之一,因此需要确保您使用的 JavaScript 引擎支持此版本。与之前的写法强制转换大整数的库相比,BigInt 的使用方法相对简单,同时也较快。除了处理大整数之外,BigInt 还可以用于更安全地管理密码哈希等敏感数据存储。在使用 BigInt 的同时,不应忽略函数的新性质和在浏览器兼容方面的限制。
总结
现在我们已经了解了 BigInt 的用法,实际上,BigInt 一经发布,就在很小的时间内被广泛接受。我们已经了解了 BigInt 的许多重要功能,了解了以下重要函数与 BigInt.asString(),BigInt.asIntN(),BigInt.asUintN()。我们也注意到了有必要在使用 BigInt 的同时了解浏览器的兼容性。开始使用 BigInt 可以更快、更高效的处理大整数。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d05061b5eee0b525746f53