📕 重学JavaScript:你知道BigInt吗?

简介: 在一些特殊行业(比如:金融)就可能需要在前端实现高精度的数学运算,比如大数加减乘除、幂运算、位运算等。

📕 重学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 可以和一些常用的运算符一起使用,比如 +、-、*、/、% 等等。但是有几个注意事项👇:

  1. Biglnt 和 Number 不是严格相等的,也不能混合运算😭。如果要比较或运算,必须把它们转换成同一种类型。

    10 + 10n; // → TypeError
    
  2. Biglnt 不能用于 Math 对象中的方法,因为 Math 对象只支持 Number 类型🙅‍♂️。

    Math.max(2n, 4n, 6n); // → TypeError
    
  3. BigInt 在需要转换成 Boolean 的时候表现跟 Number 类似👌。换句话说,只要不是 0nBigInt就被视为真值👍。

    if(0n){//条件判断为false
    }
    if(3n){//条件为true
    }
    
  4. 元素都为BigInt的数组可以进行sort。

    const mixed = [4n, 6n, -12n, 10n];
    mixed.sort(); // [-12n, 4n, 6n, 10n]
    
  5. BigInt 可以正常地进行位运算👉,如 |、&、<<、>> 和 ^。但是不能用无符号右移运算符 >>>,因为它没有固定的位数🙅‍♂️。

    1n << 2n; // → 4n
    1n >>> 2n; // → TypeError
    
  6. 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");
}

🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨

目录
相关文章
|
19天前
|
存储 JavaScript 前端开发
编程笔记 html5&css&js 072 JavaScript BigInt数据类型
编程笔记 html5&css&js 072 JavaScript BigInt数据类型
|
6天前
|
JavaScript Java 测试技术
用于日语词汇学习的微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
用于日语词汇学习的微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
17 0
|
6天前
|
JavaScript Java 测试技术
基于小程序的英语学习交流平台+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的英语学习交流平台+springboot+vue.js附带文章和源代码设计说明文档ppt
18 2
|
6天前
|
JavaScript Java 测试技术
基于小程序的移动学习平台+springboot+vue.js附带文章和源代码说明文档ppt
基于小程序的移动学习平台+springboot+vue.js附带文章和源代码说明文档ppt
13 0
|
2天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的无纸化学习平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的无纸化学习平台附带文章和源代码设计说明文档ppt
7 2
|
2天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的初小教育课外学习生活活动平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的初小教育课外学习生活活动平台附带文章和源代码设计说明文档ppt
6 1
|
2天前
|
JavaScript Java 测试技术
基于ssm+vue.js的线上学习平台系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的线上学习平台系统附带文章和源代码设计说明文档ppt
10 0
|
3天前
|
JavaScript Java 测试技术
基于ssm+vue.js的经典诗文学习爱好者学习交流平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的经典诗文学习爱好者学习交流平台附带文章和源代码设计说明文档ppt
8 0
|
3天前
|
JavaScript Java 测试技术
基于ssm+vue.js的数据结构课程网络学习平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js的数据结构课程网络学习平台附带文章和源代码设计说明文档ppt
12 2
|
3天前
|
JavaScript Java 测试技术
基于ssm+vue.js的中学课内小说阅读与学习系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的中学课内小说阅读与学习系统附带文章和源代码设计说明文档ppt
8 1