BigInt

BigInt 是在 2019 年 9 月被正式纳入 ECMAScript 标准中的特性。虽然 BigInt 不是频繁使用的特性,但其特殊性在于它是一种新的原始数据类型,同时又属于数值类型的一种。由于 BigInt 类型的加入,JavaScript 中共支持两种数值类型,即 Number 类型和 BigInt 类型。目前,JavaScript 语言中共有以下七种原始数据类型:

  • Undefined

  • Null

  • Boolean

  • String

  • Symbol

  • Number

  • BigInt

JavaScript 语言使用双精度 64 位浮点数格式来表示 Number 类型的值。Number 类型能够安全表示的最大整数为 253 - 1,该数值能够使用内置的 Number 对象上的 MAX_SAFE_INTEGER 属性来表示。BigInt 类型能够表示任意精度的整数,尤其是大于 253 - 1 的整数,这也正是引入 BigInt 类型的原因。

创建 BigInt

我们可以使用以下两种方式来创建 BigInt 类型的值:

  • 使用 BigInt 字面量。

  • 使用 BigInt() 函数。

BigInt 字面量的语法是在一个整数后面添加一个小写字母 “n”。字母 “n” 必须紧随数字之后,两者之间不允许存在空白字符。示例如下:

const unit = 1n;

使用 BigInt() 函数也能够创建 BigInt 类型的值。BigInt() 函数会尝试将传入的参数转换为 BigInt,最基本的使用场景是将一个整数转换为 BigInt 类型的值。示例如下:

const unit = BigInt(1); // 1n

BigInt 与 Number

BigInt 类型的值能够与 Number 类型的值进行大小及相等关系的比较。在进行严格相等比较时,BigInt 类型的值与 Number 类型的值永远不相等。在进行非严格相等比较及大小关系比较时,BigInt 类型的值与 Number 类型的值将进行数学意义上的比较。

虽然 BigInt 类型的值可以与 Number 类型的值进行比较,但是 BigInt 类型的值不允许与 Number 类型的值一起进行混合数学运算。示例如下:

// 类型错误!无法混合使用BigInt和其他类型
1 + 1n;

通过内置的 Number() 函数能够将 BigInt 类型的值转换为 Number 类型的值。但要注意,在 BigInt 类型与 Number 类型之间进行强制类型转换时有可能损失精度。示例如下:

Number(1n);  // 1