一文读懂JavaScript长整型(BigInt)

JavaScript 中的一种数据类型是长整数类型。

数值类型通常用于执行数值操作和计算,但长整数类型可以处理数值类型无法处理的大整数。

这一次,我将解释如何处理长整数类型。

长整型 (BigInt)

长整数类型是处理任意精度整数的数据类型。

在JavaScript中,所有数字都以IEEE754双精度浮点数(64 位)表示,所以可以准确处理的数字范围是有上限的。

在数值类型中可以安全处理的最大数值如下获得。

console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

使用数值大于此的数值类型可能会导致结果不准确。

console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992

// 不会变成9007199254740993
console.log(Number.MAX_SAFE_INTEGER + 2); // 9007199254740992

因此,从 ES2020 引入了长整数类型(BigInt),使得准确表示大值成为可能。

可以通过在整数文字末尾添加n来创建长整数。

// 可以处理大于9007199254740991的值
console.log(9007199254740992n); // 9007199254740992n
console.log(9007199254740993n); // 9007199254740993n

它也可以通过调用 BigInt 对象的构造函数来创建。参数可以是数字或字符串。

const num1 = BigInt(10);
console.log(num1); // 10n

const num2 = BigInt('10');
console.log(num2); // 10n

由于仅整数支持长整数,因此包含小数点是错误的。

// Invalid or unexpected token
let num = 3.14n;

一文读懂JavaScript长整型(BigInt)

如何处理长整数

接下来我们来看一下长整数的处理模式。

算术运算符

长整数可以像数字一样用算术运算符处理。

console.log(10n + 5n); // 15n
console.log(10n - 5n); // 5n
console.log(10n * 5n); // 50n
console.log(10n / 5n); // 2n
console.log(10n % 5n); // 0n
console.log(10n ** 5n); // 100000n

长整数的除法计算会截断小数点后的值。

// 注意不是2.5n
console.log(5n / 2n); // 2n

不能混合使用长整数和数字。

console.log(10n + 5); // Cannot mix BigInt and other types, use explicit conversions

递增和递减运算符的使用方式与数字相同。

let num = 10n;

console.log(++num); // 11n
console.log(num++); // 11n

num = 5n;

console.log(--num); // 4n
console.log(num--); // 4n

请注意,长整数可以使用一元减号运算符,但不支持一元加号运算符。

console.log(-10n); // -10n
console.log(+10n); // Cannot convert a BigInt value to a number

比较运算符

除了长整数之间的比较操作,还可以比较长整数和数字。

console.log(10n > 5n); // true
console.log(10n >= 8); // true

请注意,长整数和数字属于不同类型。

即使在比较相同的值时,相等比较结果为true,严格比较结果则为false。

console.log(10n == 10); // true
console.log(10n === 10); // false

逻辑运算

在计算逻辑值时,长整数的行为与数字的行为相同。

if (0n) {
  console.log('什么都不会发生');
}

此外,使用AND和OR运算符进行短路求值的方式与数值相同。

console.log(10n && 5n); // 5n
console.log(0n && 5n); // 0n

console.log(10n || 5n); // 10n
console.log(0n || 5n); // 5n

长整数和数字之间的转换

一元加运算符是一种将非数字值转换为数字的方法。

长整数不支持一元加运算符,这会造成混淆。

因此,如果要将长整数转换为数字,可以使用Number()。如果要将数字转换为长整数,则使用BigInt()。

let bigint = 10n;
let num = 5;

console.log(Number(10n)); // 10
console.log(BigInt(num)); // 5n

结语

这一次,我解释了如何处理长整数类型。

//重点

  • 长整数类型是处理任意精度整数的数据类型

  • 可以处理大于9007199254740991的值

  • 在处理运算符和逻辑值时,大部分情况下和数值的行为相同

  • 可以用BigInt()或Number()将长整数和数值相互转换