概念
BigInt 是一种内置对象,它提供了一种方法来表示大于 253 - 1的整数。BigInt 可以表示任意大的整数。
为什么会出现 BigInt 数据类型
JavaScript中的基本数据类Number是双精度浮点数,它可以表示的最大安全范围是正负的2的53次方减一。对安全整数范围以外的整数(即从Number.MIN_SAFE_INTEGER到Number.MAX_SAFE_INTEGER)的任何计算可能会失去精度。出于这个原因,我们只能依靠安全范围内的数字整数值。
BigInt是JavaScript中的一个新的原始类型,可以用任意精度表示整数。使用BigInt,即使超出JavaScript Number 的安全整数限制,也可以安全地存储和操作大整数。
如何创建 BigInt ?
可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:120n,或者调用函数BigInt()。
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
console.log(theBiggestInt, alsoHuge);
// 9007199254740991n 9007199254740991n
类型
typeof 1n
// "bigint"
typeof BigInt('1')
// "bigint"
运算
以下操作符可以和 BigInt 一起使用:
+
*
-
**
%
- 除
>>>
(无符号右移)之外的 位操作 也可以支持。因为 BigInt 都是有符号的,>>>
(无符号右移)不能用于 BigInt。 - 为了兼容 asm.js ,BigInt 不支持单目 (+) 运算符。不支持一元加号(+)运算符的原因是某些程序可能依赖于+始终生成Number的不变量,或者抛出异常。 更改+的行为也会破坏asm.js代码。
+10n;
// VM123:1 Uncaught TypeError: Cannot convert a BigInt value to a number
与 BigInt 操作数一起使用时,算术运算符应该返回 BigInt 值。
除法(/)运算符的结果会自动向下舍入到最接近的整数。
比较
BigInt 和 Number 不是严格相等的,但是宽松相等的。
0n === 0
// false
0n == 0
// true
Number
和 BigInt
可以进行比较。
1n < 2
// true
2n > 1
// true
2 > 2
// false
2n > 2
// false
2n >= 2
// true
元素都为BigInt的数组可以进行sort
let arr = [3n, 5n, 7n, 1n, 2n, 3n];
console.log(arr.sort());
但如果数组当中存在非 BigInt 类型的数值时,会存在排序错误的情况。
比如:
let arr = [3n, 5n, 7n, 1n, 2n, 3n, 8];
console.log(arr.sort());
这时 sort 就会出现排序错误。
function sortIncludeArr(arr) {
let left = [], right = [];
arr.map(i => {
if (typeof i === "bigint") {
right.push(i)
} else {
left.push(i)
}
});
return left.sort((a, b) => a - b).concat(right.sort())
}
兼容性不是很好
只有chrome67、firefox、Opera这些主流实现,要正式成为规范,其实还有很长的路要走。
总结
BigInt是一种新的数据类型,用于当整数值大于Number数据类型支持的范围时。这种数据类型允许我们安全地对大整数执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,而不需要使用库。
重要的是要记住,不能使用Number和BigInt操作数的混合执行算术运算,需要通过显式转换其中的一种类型。 此外,出于兼容性原因,不允许在BigInt上使用一元加号(+)运算符。
参考文章: