JS 基本数据类型之 BigInt 的知识点

概念

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 一起使用:

  1. +
  2. *
  3. -
  4. **
  5. %
  6. >>> (无符号右移)之外的 位操作 也可以支持。因为 BigInt 都是有符号的, >>> (无符号右移)不能用于 BigInt。
  7. 为了兼容 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

NumberBigInt 可以进行比较。

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上使用一元加号(+)运算符。

参考文章:

JS最新基本数据类型:BigInt
BigInt MDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值