ES11 中字面量 BigInt 的正确书写方式

在 JavaScript 的最新标准 ES11 中新增了一种称为 BigInt 的类型,它用于表示超出普通 Number 类型范围的整数,即 2^53 - 1 (约为 9 x 10^15)超出了 Number 能表示的取值范围。BigInt 可以表示任意精度的整数,甚至可以用来表示 BigInt 是用来在商业应用、物理学、密码等领域处理极大量数字的理想方法。在本文中,我们将介绍在 ES11 中 BigInt 字面量的正确书写方法,以及使用 BigInt 的一些注意事项。

BigInt 字面量的正确书写方法

在 ES11 中,可以使用数字后加 n 或者使用 BigInt 构造函数来创建 BigInt。其中,使用数字后加 n 的方式是最为常见直接的方式。例如:

const bigIntNum = 1234567890123456789012345678901234567890n;

在 BigInt 字面量中,使用十进制数字来表示整数,而且十进制数字中不能包含任何小数点,包括指数型表示法。同时,也不能在字面量中使用任何数字字面量前缀。例如,以下写法都是错误的:

const wrongBigIntNum = 1234567890123456789012345678901234567890; // wrong
const wrongBigIntNum = "1234567890123456789012345678901234567890" // wrong
const wrongBigIntNum = 1234567890123456789012345678901234567890bn; // wrong

想要判断数值是否为 BigInt 类型,可以使用 typeof 或者 instanceof 进行判断,例如:

const num = 123n;
console.log(typeof num); // "bigint"
console.log(num instanceof BigInt); // true

BigInt 的使用注意事项

BigInt 的使用需要注意以下注意事项:

  • BigInt 与 Number 格式不兼容,它们是不同数据类型。这意味着 BigInt 数据不能与 Number 数据使用加号或其它算数操作符结合使用。例如:

    const bigIntNum = 9007199254740992n;
    const num = 1;
    console.log(bigIntNum + num);  // TypeError: Cannot mix BigInt and other types
  • BigInt 不能使用 Math 对象上的方法,这些方法仅仅适用于 JavaScript 中的 Number 类型,而不能处理 BigInt 类型的数据。如果需要处理 BigInt 类型数据需要使用 JavaScript 内置的 BigInt 类型的方法。例如:

    const bigIntNum = 1234567890123456789012345678901234567890n;
    console.log(Math.sqrt(bigIntNum)); // TypeError: Cannot convert a BigInt value to a number
    console.log(bigIntNum ** 0.5n); // 1111111111111040284n 
  • 除了使用 BigInt 构造函数,还可以将 Number 数据转换为 BigInt,可以使用带有“n”后缀的 BigInt 字面量, 或者使用 BigInt() 方法进行转换。例如:

    const num = 42;
    const bigIntNum1 = BigInt(num);
    const bigIntNum2 = 42n;
    console.log(bigIntNum1); // 42n
    console.log(bigIntNum2); // 42n

总结

ES11 中新增的 BigInt 类型让我们可以愉快地处理超过普通 Number 范围的整数。在使用 BigInt 字面量时只需在整数后紧跟一个 n,而在需要进行 BigInt 数据处理或操作时,需要注意 BigInt 与 Number 的不兼容性。但是,BigInt 的使用将大大提高在处理大整数方面的精度和效率。重要的是,要避免在数学计算中将 BigInt 与 Number 相混淆。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0d44aadd4f0e0ff907fb1


纠错反馈