长整数是 JavaScript 中的一种数据类型。由于它可以处理任意精度的整数,因此它可以处理数字类型无法处理的非常大的整数。在这里,我将解释如何在 JavaScript 中使用长整数。(*长整数 ( BigInt ) 可从 ECMAScript 2020 (ES9) 获得。)
目录
5-1 如何写长整数文字
5-2 可用于长整数文字的运算符
5-3 将长整数文字转换为数字
要在程序中使用长整型值,只需编写一个长整型文字,即长整型的值。本节介绍如何在 JavaScript 中编写长整型文字。
长整数文字
长整型文字用于描述程序中的长整型值。写长整型字面量时,在写完数值后在末尾写n。
let num = 854n;
与数值一样,除十进制数外,数字还可以写成十六进制数、八进制数和二进制数。
let num1 = 0xB6n; // 在十六进制前缀 0x
let num2 = 0o266n; // 在八进制前添加 0o
let num3 = 0b10110110n; // 在二进制中添加 0b
由于长整数只是整数,所以不能写带小数点的值。我得到一个错误。
let num = 7.34n;
>> Uncaught SyntaxError: Invalid or unexpected token
还可以使用 BigInt 对象的构造函数创建长整型文字,如下所示:
let num = BigInt(1024);
console.log(num);
>> 1024n
可以用长整数表示的整数
可以用数字文字安全表示的最大数字是 2 53 -1 (=9007199254740991),该值定义为 Number.MAX_SAFE_INTEGER。
对超过此数量的值进行操作可能会产生不正确的结果。看看下面的示例。
let num = Number.MAX_SAFE_INTEGER;
console.log(num);
>> 9007199254740991
console.log(num + 1);
>> 9007199254740992
console.log(num + 2);
>> 9007199254740992
Number.MAX_SAFE_INTEGER + 2 = 9007199254740993,但结果是9007199254740992。因此,数字文字不能安全地处理超过 Number.MAX_SAFE_INTEGER 的数字。
另一方面,长整数文字可以处理任意精度的数字,因此您可以安全地使用超过整数文字可以安全处理的数字。看看下面的示例。
let num = 9007199254740991n;
console.log(num);
>> 9007199254740991n
console.log(num + 1n);
>> 9007199254740992n
console.log(num + 2n);
>> 9007199254740993n
与数字文字一起使用时给出错误结果的操作现在可以在与长整型文字一起使用,获得正确的结果。
这一节中我们主要解释可与长整数文字一起使用的运算符以及数字文字之间运算的注释。
长整数文字的算术运算符
可以使用加法运算符 (+)、减法运算符 (-)、乘法运算符 (*)、除法运算符 (/)、模运算符模运算符 (%)、长整数文字中的指数运算符 (**)。
console.log(20n + 38n);
>> 58n
console.log(45n - 16n);
>> 29n
console.log(8n * 7n);
>> 56n
console.log(34n / 8n);
>> 4n
console.log(34n % 8n);
>> 2n
console.log(9n ** 3n);
>> 729n
注意/操作的结果是一个整数,因为长整数的操作结果是一个整数。小数点后的值被截断。
console.log(7n / 3n); // 2.333
>> 2n
console.log(8n / 3n); // 2.666
>> 2n
不能在长整数文字和数字文字之间执行算术运算。
console.log(16n + 8);
>> Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
长整数文字的按位/移位运算符
按位运算符,例如按位与 ( & )、按位或 ( | )、按位异或 ( ^ ) 和按位非 ( ~ ) 可以在长整型文字中使用。
console.log(27543n & 19024n);
>> 18960n
console.log(27543n | 19024n);
>> 27607n
console.log(27543n ^ 19024n);
>> 8647n
console.log(~27543n);
>> 27544n
不能在长整数文字和数字文字之间执行按位运算。
console.log(27543n & 19024);
>> Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
可以将移位运算符左移 (<<) 和带符号的右移 (>>) 与长整数文字一起使用。
console.log(27543n << 3n);
>> 220344n
console.log(27543n >> 3n);
>> 3442n
console.log(-27544n >> 3n);
>> -3443n
但是,不能使用无符号右移 (>>>)。
console.log(27543n >>> 3n);
>> Uncaught TypeError: BigInts have no unsigned right shift, use >> instead
不能在长整数文字和数字文字之间执行移位操作。
console.log(27543n << 3);
>> Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
可以在长整数文字中使用相等运算符 (==)、不等运算符 (!=)、严格相等运算符 (===)、严格不等运算符 (!==)。
console.log(54n == 54n);
>> true
console.log(54n == 48n);
>> false
console.log(38n === 38n);
>> true
相等运算符允许您比较长整数文字和数字文字的相等性。如果值相同,则相等运算符(==)为真,但严格相等运算符(===)为假,因为数据类型不同。
console.log(54 == 54n);
>> true
console.log(54 === 54n);
>> false
长整数文字上的关系运算符
您可以在长整数文字中使用小于 ( < )、小于 ( <= )、大于 ( > ) 和大于 ( >= ) 的关系运算符。
console.log(12n > 28n);
>> false
console.log(34n <= 48n);
>> true
关系运算符允许在长整数文字和数字文字之间进行大小比较。
console.log(14 < 32n);
>> true
console.log(33n >= 41);
>> false
长整数文字的递增/递减运算符
递增运算符 (++) 和递减运算符 (–) 可用于长整数文字。。
let num = 15n;
num++;
console.log(num);
>> 16n
--num;
console.log(num);
>> 15n
长整数文字的一元减/一元加运算符
可以在长整数文字中使用一元减号运算符 (-)。
console.log(-15n);
>> -15n
如果为一元加号或一元减号运算符指定非数字操作数,则任何可以转换为数字的都将转换为数字,而任何不能转换为数字的将转换为 NaN。但是,对长整数文字使用一元减号运算符只会转换长整数文字的符号,而不会将其转换为数字文字。
此外,一元加号运算符 ( + ) 不能与长整型文字一起使用。
console.log(+15n);
>> Uncaught TypeError: Cannot convert a BigInt value to a number
要在长整数文字和数字文字之间执行算术运算,两种数据类型必须相同。本节介绍如何将长整数文字 (BigInt) 的类型更改为数字文字 (Number)。
将长整数文字转换为数字文字
在长指数文字和整数文字之间使用加法或乘法运算符是错误的。
console.log(152n + 38);
>> Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
因此,执行类型转换以统一到任一数据类型。首先是如何将长整数文字转换为数字文字。第一种方法是使用 Number 函数。
let bignum = 1033n;
let num = Number(bignum);
console.log(bignum);
>> 1033n
console.log(num);
>> 1033
我能够将长整型值更改为数字类型。但是,如果将超过数字类型可以安全处理的范围的长整数值转换为数字类型,则精度可能会下降。
另一种方法是使用全局 parseInt 函数。
let bignum = 1033n;
let num = parseInt(bignum);
console.log(bignum);
>> 1033n
console.log(num);
>> 1033
我能够将长整型值更改为数字类型。精度可能下降的点与以前相同。
将数字文字转换为长整型文字
要将数字文字反向转换为长整型文字,请使用 BigInt 函数。
let num = 842;
let bignum = BigInt(num);
console.log(num);
>> 842
console.log(bignum);
>> 842n
我能够将数字类型值更改为长整数类型。