在 ES12 中使用 BigInt,如何避免错误和提高性能?

阅读时长 6 分钟读完

在 JavaScript 中,数字类型的最大值是 Number.MAX_SAFE_INTEGER,它的值是 2 的 53 次方减 1,也就是 9007199254740991。如果需要处理更大的整数,就需要使用 BigInt 类型了。BigInt 是 ES12 新增的一种数据类型,可以表示任意精度的整数。本文将介绍如何在 ES12 中使用 BigInt,避免常见的错误,并提高性能。

基本语法

BigInt 类型的字面量是在整数后面加上一个 n,例如:

注意,不加 n 的整数是 Number 类型,而不是 BigInt 类型。

BigInt 类型支持所有 Number 类型的运算,例如加减乘除、位运算、比较等。BigInt 类型和 Number 类型之间可以进行混合运算,但要注意类型转换的问题。

避免常见错误

不要使用 BigInt 类型的构造函数

BigInt 类型有一个构造函数,可以使用字符串或数字作为参数来创建一个 BigInt 对象。例如:

但是,这种方式可能会出现精度丢失的问题。例如:

这是因为参数转换成 BigInt 类型时,可能会发生精度丢失。因此,最好使用字面量的方式来创建 BigInt 类型的变量,例如:

不要使用 BigInt 类型的比较运算符

在 JavaScript 中,有两种比较运算符:=====。对于 Number 类型的变量,它们是等价的,但对于 BigInt 类型的变量,它们是不等价的。例如:

-- -------------------- ---- -------
----- - - --------------------------------
----- - - --------------------------------
------------- -- --- -- ----
------------- --- --- -- ----

----- - - ------------------
----- - - ------------------
------------- -- --- -- ----
------------- --- --- -- -----

因此,最好使用 === 运算符来比较 BigInt 类型的变量。

不要使用 BigInt 类型的 Math 对象

在 JavaScript 中,有一个 Math 对象,可以进行数学运算。但是,Math 对象只支持 Number 类型的运算,不支持 BigInt 类型的运算。例如:

因此,如果需要进行数学运算,必须使用 BigInt 类型的运算符,例如 +-*/%**&|^<<>>>>> 等。

提高性能

在使用 BigInt 类型时,要注意以下几点,可以提高性能。

避免类型转换

BigInt 类型和 Number 类型之间可以进行混合运算,但要注意类型转换的问题。如果频繁进行类型转换,会影响性能。因此,最好在变量定义时就确定类型,避免类型转换。例如:

使用位运算

位运算是一种比较快速的运算方式,可以用来进行一些高精度运算。例如,可以使用位运算来计算两个 BigInt 类型的变量的和。例如:

-- -------------------- ---- -------
-------- ------ -- -
  --- ----- - ---
  --- ------ - ---
  --- ---- - ---
  ----- -- -- - -- ------ -
    ----- - - - - -----
    ----- - - - - -----
    ------ -- - - - - ------
    ----- - -- - -- - -- - ------ - -- - -------
    ----- --- ---
    ---- --- ---
    - --- ---
    - --- ---
  -
  ------ -------
-

----- - - --------------------------------
----- - - --------------------------------
----- - - ------ ---
--------------- -- ------------------------------------------------------------------------

这个函数的实现比较复杂,但是比较快速。

使用数组存储高精度数

在进行高精度运算时,可以使用数组来存储每一位的数字。例如:

-- -------------------- ---- -------
-------- ------ -- -
  ----- ------ - ---
  --- ----- - ---
  --- - - --
  ----- -- - -------- -- - - -------- -- ------ -
    ----- - - ---- -- ---
    ----- - - ---- -- ---
    ----- --- - - - - - ------
    --------------- - -----
    ----- - --- - ----
    ----
  -
  ------ -------
-

----- - - ---- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ----
----- - - ---- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ----
----- - - ------ ---
--------------- -- ---- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

这种方式比较直观,但是需要注意数组的下标越界问题。

结论

在 ES12 中,BigInt 类型可以用来表示任意精度的整数。在使用 BigInt 类型时,要注意避免常见的错误,例如不要使用 BigInt 类型的构造函数、不要使用 BigInt 类型的比较运算符、不要使用 BigInt 类型的 Math 对象等。同时,可以使用一些技巧来提高性能,例如避免类型转换、使用位运算、使用数组存储高精度数等。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6765428476af2b9a20eaa257

纠错
反馈