JavaScript中的BigInt类型

????? 个人主页:《爱蹦跶的大A阿》

??当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

?

? 前言

        在我们日常生活中,JavaScript已经成为了一种无处不在的编程语言。它的应用范围从简单的网页动画,到复杂的前端框架,再到后端的Node.js,甚至还包括物联网设备。然而,JavaScript并非一成不变,它一直在发展,一直在添加新的特性和功能。今天,我们将探讨JavaScript中的一个新的数据类型:BigInt。这个新的数据类型允许我们在JavaScript中处理任意大小的整数,这在处理大量数据或高精度计算时非常有用。在这篇文章中,我们将详细介绍BigInt,包括它的定义、使用方法、数学运算、比较运算,以及如何在不支持BigInt的浏览器中进行polyfill。

?

? 正文

什么是BigInt

        BigInt是JavaScript中最近添加的一种特殊的数字类型,它提供了对任意长度整数的支持。创建BigInt的方式有两种:在一个整数字面量后面加n,或者调用BigInt函数,该函数从字符串、数字等中生成BigInt。

const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt("1234567890123456789012345678901234567890");
const bigintFromNumber = BigInt(10); // 与 10n 相同

BigInt的数学运算

BigInt大多数情况下可以像常规数字类型一样使用。例如:

alert(1n + 2n); // 3
alert(5n / 2n); // 2

        请注意,除法5/2的结果向零进行舍入,舍入后得到的结果没有了小数部分。对BigInt的所有操作,返回的结果也是BigInt。

我们不可以把BigInt和常规数字类型混合使用:

alert(1n + 2); // Error: Cannot mix BigInt and other types

如果有需要,我们应该显式地转换它们:使用BigInt()或者Number(),像这样:

let bigint = 1n;
let number = 2;

// 将 number 转换为 bigint
alert( bigint + BigInt( number)); // 3

// 将 bigint 转换为 number
alert(Number( bigint) + number); // 3

        转换操作始终是静默的,绝不会报错,但是如果BigInt太大而数字类型无法容纳,则会截断多余的位,因此我们应该谨慎进行此类转换。

BigInt不支持一元加法

        一元加法运算符+value,是大家熟知的将value转换成数字类型的方法。为了避免混淆,在BigInt中不支持一元加法:

let bigint = 1n;
alert( + bigint ); // error

所以我们应该用Number()来将一个BigInt转换成一个数字类型。

比较运算符

比较运算符,例如<和>,使用它们来对BigInt和number类型的数字进行比较没有问题:

alert( 2n > 1n ); // true
alert( 2n > 1 ); // true

         但是请注意,由于number和BigInt属于不同类型,它们可能在进行==比较时相等,但在进行===(严格相等)比较时不相等:

alert( 1 == 1n ); // true
alert( 1 === 1n ); // false

布尔运算

        当在if或其他布尔运算中时,BigInt的行为类似于number。例如,在if中,BigInt 0n为假,其他值为真:

if (0n) {
  // 永远不会执行
}

 布尔运算符,例如||,&&和其他运算符,处理BigInt的方式也类似于number:

alert( 1n || 2 ); // 1(1n 被认为是真)
alert( 0n || 2 ); // 2(0n 被认为是假)

Polyfill

        Polyfilling BigInt比较棘手。原因是许多JavaScript运算符,比如+和-等,在对待BigInt的行为上与常规number相比有所不同。例如,BigInt的除法总是返回BigInt(如果需要,会进行舍入)。想要模拟这种行为,polyfill需要分析代码,并用其函数替换所有此类运算符。但是这样做很麻烦,并且会耗费很多性能。所以,目前并没有一个众所周知的好用的polyfill。

        不过,JSBI库的开发者提出了另一种解决方案。该库使用自己的方法实现了大的数字。我们可以使用它们替代原生的BigInt。

运算 原生 BigInt JSBI
从 Number 创建 a = BigInt(789) a = JSBI.BigInt(789)
加法 c = a + b c = JSBI.add(a, b)
减法 c = a - b c = JSBI.subtract(a, b)

        然后,对于那些支持BigInt的浏览器,可以使用polyfill(Babel插件)将JSBI调用转换为原生的BigInt。换句话说,这个方法建议我们在写代码时使用JSBI替代原生的BigInt。但是JSBI在内部像使用BigInt一样使用number,并最大程度按照规范进行模拟,所以代码已经是准备好转换成BigInt的了(BigInt-ready)。对于不支持BigInt的引擎,我们可以“按原样”使用此类JSBI代码,对于那些支持BigInt的引擎——polyfill会将调用转换为原生的BigInt。 

? 结语

        JavaScript的BigInt类型为我们打开了一个全新的世界,让我们能够在JavaScript中处理任意大小的整数。虽然BigInt在一些方面与常规的数字类型有所不同,但是只要我们理解了这些差异,并知道如何正确地使用BigInt,我们就能够充分利用它的强大功能。无论你是正在处理大数据,还是在进行高精度计算,BigInt都能够提供强大的支持。希望这篇文章能够帮助你理解和掌握JavaScript中的BigInt类型,让你在编程的道路上更进一步。如果你有任何问题或者需要更深入的讨论,欢迎随时向我提问!

?