百科狗-知识改变命运!
--

BigInt - JavaScript BigInt 对象

梵高1年前 (2023-11-21)阅读数 17#技术干货
文章标签整数

BigInt

BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1的整数。这原本是 Javascript 中可以用Number表示的最大数字。BigInt可以表示任意大的整数。


描述

可以用在一个整数字面量后面加n的方式定义一个BigInt,如:10n,或者调用函数BigInt()(但不包含new运算符)并传递一个整数值或字符串值。

const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n

const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n

const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n

它在某些方面类似于Number,但是也有几个关键的不同点:不能用于Math对象中的方法;不能和任何Number实例混合运算,两者必须转换成同一种类型。在两种类型来回转换时要小心,因为BigInt变量在转换成Number变量时可能会丢失精度。


类型信息

使用typeof测试时,BigInt对象返回"bigint":

typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true

使用Object包装后,BigInt被认为是一个普通"object":

typeof Object(1n) === 'object'; // true


运算

以下操作符可以和BigInt一起使用:+*-**%。除>>>(无符号右移)之外的位操作(en-US)也可以支持。因为BigInt都是有符号的,>>>(无符号右移)不能用于BigInt。为了兼容 asm.js,BigInt不支持单目(+)运算符。

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991n

const maxPlusOne = previousMaxSafe + 1n;
// ↪ 9007199254740992n

const theFuture = previousMaxSafe + 2n;
// ↪ 9007199254740993n, this works now!

const multi = previousMaxSafe * 2n;
// ↪ 18014398509481982n

const subtr = multi – 10n;
// ↪ 18014398509481972n

const mod = multi % 10n;
// ↪ 2n

const bigN = 2n ** 54n;
// ↪ 18014398509481984n

bigN * -1n
// ↪ –18014398509481984n

/操作符对于整数的运算也没问题。可是因为这些变量是BigInt而不是BigDecimal,该操作符结果会向零取整,也就是说不会返回小数部分。

警告:当使用BigInt时,带小数的运算会被取整。

const expected = 4n / 2n;
// ↪ 2n

const rounded = 5n / 2n;
// ↪ 2n, not 2.5n


比较

BigIntNumber不是严格相等的,但是宽松相等的。

0n === 0
// ↪ false

0n == 0
// ↪ true

NumberBigInt可以进行比较。

1n  1
// ↪ true

2 > 2
// ↪ false

2n > 2
// ↪ false

2n >= 2
// ↪ true

两者也可以混在一个数组内并排序。

const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
// ↪  [4n, 6, -12n, 10, 4, 0, 0n]

mixed.sort();
// ↪ [-12n, 0, 0n, 10, 4n, 4, 6]

注意被Object包装的BigInt使用 object 的比较规则进行比较,只用同一个对象在比较时才会相等。

0n === Object(0n); // false
Object(0n) === Object(0n); // false

const o = Object(0n);
o === o // true


条件

BigInt在需要转换成Boolean的时表现跟Number类似:如通过Boolean函数转换;用于Logical Operators(en-US)||,&&,和!的操作数;或者用于在像if statement这样的条件语句中。

if (0n) {
  console.log('Hello from the if!');
} else {
  console.log('Hello from the else!');
}

// ↪ "Hello from the else!"

0n || 12n
// ↪ 12n

0n && 12n
// ↪ 0n

Boolean(0n)
// ↪ false

Boolean(12n)
// ↪ true

!12n
// ↪ false

!0n
// ↪ true


构造器

BigInt()

创建BigInt对象。


静态方法

BigInt.asIntN()

将 BigInt 值转换为一个-2^(width-1)与 2^(width-1)- 1 之间的有符号整数。

BigInt.asUintN()

将一个 BigInt 值转换为 0 与 2^(width)- 1 之间的无符号整数。


实例方法

BigInt.prototype.toLocaleString()

返回此数字的 language-sensitive 形式的字符串。覆盖Object.prototype.toLocaleString()方法。

BigInt.prototype.toString()

返回以指定基数(base)表示指定数字的字符串。覆盖Object.prototype.toString()方法。

BigInt.prototype.valueOf()

返回指定对象的基元值。覆盖Object.prototype.valueOf()方法。

BigInt - JavaScript BigInt 对象


使用建议

转化

由于在NumberBigInt之间进行转换会损失精度,因而建议仅在值可能大于 2^53 时使用BigInt类型,并且不在两种类型之间进行相互转换。


密码学

由于对BigInt的操作不是常数时间的,因而BigInt不适合用于密码学。


在 JSON 中使用

对任何BigInt值使用JSON.stringify()都会引发TypeError,因为默认情况下BigInt值不会在JSON中序列化。但是,如果需要,可以实现toJSON方法:

BigInt.prototype.toJSON = function() { return this.toString(); }

JSON.stringify现在生成如下字符串,而不是抛出异常:

JSON.stringify(BigInt(1));
// '"1"'


例子

Calculating Primes

function isPrime(p) {
  for (let i = 2n; i * i = 0n) {
    if (isPrime(maybePrime)) {
      nth -= 1n;
      prime = maybePrime;
    }
    maybePrime += 1n;
  }

  return prime;
}

nthPrime(20n)
// ↪ 73n

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)