📕 重学JavaScript:你知道BigInt吗?
嗨,大家好!这里是道长王jj
~ 🎩🧙♂️
当你看到这个标题,你可能会感到不屑,JavaScript大部分在前端场景应用,前端场景需要运用到这么大的整数操作吗?
但是平时用不到,不代表它永远不存在这种场景。在一些特殊行业(比如:金融)就可能需要在前端实现高精度的数学运算,比如大数加减乘除、幂运算、位运算等。或者在前后端交互的时候,传参入参时为了避免精度丢失而需要(虽然这里可以直接传入string类型,没有必要传入number类型)。
❓ 什么是BigInt
?
Biglnt
是 JavaScript 中的一个新的数据类型,它可以表示比 2^53 - 1 还要大的整数🐘。这是因为 JavaScript 中原来的 Number 类型只能精确地表示到这个数字,再大就会出错😱。所以,如果你需要处理一些超级大的整数,比如说银行大额计算、星际坐标等等,你就可以用 Biglnt
来存储它们😊。这样我们就不需要引用第三方库了。
❓ 我不使用BigInt
计算超大数会发生什么?
如果你不使用 Biglnt
计算超大数,你可能会遇到一些问题😱。因为 JavaScript 中的 Number 类型只能精确地表示到 2^53 - 1 这个数字,再大就会出错😭。比如说,你想把两个超大数相加,结果却不对:
9007199254740992 + 1 //9007199254740994
// 任何超出此范围的整数值都可能失去精度。
console.log(999999999999999); // 10000000000000000
这是因为 JavaScript 中的所有数字都是用 64 位的浮点数来存储的,所以超过一定范围的整数就不能准确地表示了🤯。这样就会影响你的计算结果和程序逻辑😥。
所以,如果你需要处理一些超级大的整数,你最好用 Biglnt
类型来存储它们😊。Biglnt
可以表示任意大的整数,而且不会丢失精度😎。
而且也会有一定的安全性问题🤯:
9007199254740992 === 9007199254740993; // true
❓ 我怎么使用BigInt
?
在一个整数后面加上 n,就可以把它变成一个 Biglnt
。比如说,10n
就是一个 Biglnt
。
typeof 10n // "bigint"
用 BigInt()
函数(不要用 new 哦),并且给它传入一个整数值或字符串值。比如说,BigInt(10)
或者 BigInt(“10”)
也都是 Biglnt
。
typeof BigInt(10) // "bigint"
这里总结了一些简单使用案例 ❤ :
10n + 20n; // → 30n
10n - 20n; // → -10n
+10n; // → TypeError: Cannot convert a BigInt value to a number
-10n; // → -10n
10n * 20n; // → 200n
20n / 10n; // → 2n
23n % 10n; // → 3n
10n ** 3n; // → 1000n
let x = 10n;
++x; // → 11n
--x; // → 9n
console.log(typeof x); //"bigint"
❗ BigInt
可不能当一般的 Number 类型使用!
Biglnt
可以和一些常用的运算符一起使用,比如 +、-、*、/、% 等等。但是有几个注意事项👇:
Biglnt
和 Number 不是严格相等的,也不能混合运算😭。如果要比较或运算,必须把它们转换成同一种类型。10 + 10n; // → TypeError
Biglnt
不能用于 Math 对象中的方法,因为 Math 对象只支持 Number 类型🙅♂️。Math.max(2n, 4n, 6n); // → TypeError
BigInt
在需要转换成 Boolean 的时候表现跟 Number 类似👌。换句话说,只要不是0n
,BigInt
就被视为真值👍。if(0n){//条件判断为false } if(3n){//条件为true }
元素都为
BigInt
的数组可以进行sort。const mixed = [4n, 6n, -12n, 10n]; mixed.sort(); // [-12n, 4n, 6n, 10n]
BigInt
可以正常地进行位运算👉,如 |、&、<<、>> 和 ^。但是不能用无符号右移运算符 >>>,因为它没有固定的位数🙅♂️。1n << 2n; // → 4n 1n >>> 2n; // → TypeError
Biglnt
不能有小数部分,如果有的话会被取整。
📵 浏览器兼容性
目前 BigInt
的兼容性得分 94.85%
,基本上已经全面支持了主流的浏览器。 但是如果您的公司还在兼容旧浏览器的话,不建议尝试使用。
你可以使用以下的代码来检测浏览器是否支持BigInt:
// 如果浏览器支持BigInt,typeof 1n会返回"bigint"
if (typeof 1n === "bigint") {
console.log("This browser supports BigInt");
} else {
console.log("This browser does not support BigInt");
}
🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨