社区编辑申请
注册/登录
面试官:聊聊 BigInt?
开发 前端
BigInt 可以表示任意大的整数,目前的使用场景是相对较少的。BigInt 的使用需要注意的点还是非常多的,因而建议仅在值可能大于2^53 时使用 BigInt 类型。目前的兼容性一般,可以考虑使用 jsbi 这个库替代。

我们知道,现在 JavaScript 有 7 种基础类型,null/undefined/number/string/boolean/bigint/symbol。其中 bigint 是 ES2020 中正式加入的,有个别的面试官喜欢深挖这个特性,那么我们来了解一下 BigInt 到底是什么?我们为什么需要 BigInt 吧?

BigInt 是什么?

概念

我们知道 JavaScript 中 Number 类型最大的数值为 2^53- 1,也就是 Number.MAX_SAFE_INTEGER。

BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。也就是说,BigInt 可以表示任意大的整数。

声明

可以在一个整数字面量后面加上 n 或者调用函数 BigInt() 定义一个 BigInt。如下:

const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
//9007199254740991n

类型检测

typeof 检测 BigInt 对象返回 bigint 字符串。

typeof 1n === 'bigint'; // truetypeof BigInt('1') === 'bigint'; // true

BigInt 基础语法和注意点

BigInt 很多时候表现跟 Number 类型很像,但也有很多不同的点,这些点在用到 BigInt 类型的时候,需要思考以下的点:

运算:

语法点

支持度

备注

+、*、-、**、%

支持


/

不支持

会进行向下取整

单目 (+) 运算符

不支持


>>>(无符号右移)

不支持

因为 BigInt 都是有符号的

位运算(除了无符号右移)

支持


Math 对象方法

不支持


说明:

  • 除法的时候,当使用 BigInt 时,带小数的运算会被取整
const expected = 4n / 2n;
//2n

const rounded = 5n / 2n;
//2n, not 2.5n
  • 与 Number 混合运算的话。必须转换成同一种类型,有时候会造成精度丢失的问题,所以不建议这么使用
  • 在对象中使用 BigInt 的时候,假如使用 JSON.stringify() 会发生类型错误(TypeError)

综上所述,可以看到 BigInt 的使用需要注意的点还是非常多的,并且在和 Number 类型转换的时候还会发生精度丢失问题,因而建议仅在值可能大于2^53 时使用 BigInt 类型。

那么 BigInt 现在有哪些应用场景呢?

BigInt 的应用场景

高精度时间戳

大于 2^53 - 1 的整数的一个应用场景就是高精度时间戳。精确到纳秒级别的时间戳很常见,经常用来记录特定程序的执行事件,以便进行性能分析,BigInt 可以表示高精度时间戳,在后端性能分析、性能调优中发挥作用。

大整数 ID

比如 Twitter 的 id 生成服务,当 id 持续增长时,就会超出 JS 的安全范围,因此要求同时冗余地返回字符串型的 id。假如有 BigInt 类型就可以直接使用。

兼容性 & PolyFill

can i use[1] 中的数据显示,Chrome 的支持度会好很多,IE 全军覆没,整体覆盖 92.25% 的用户。

现在可以使用 JSBI — pure-JavaScript BigInts[2] 这个库来实现 BigInt。JSBI 是直接使用了 V8 和 Chrome 中 BigInt 的设计和实现方式,功能与浏览器中一致,语法稍有不同。假如 BigInt 被所有的浏览器原生支持后,可以使用 babel 插件 babel-plugin-transform-jsbi-to-bigint[3] 移除 JSBI 转为原生的 BigInt 语法。

总结

总体而言,BigInt 可以表示任意大的整数,目前的使用场景是相对较少的。BigInt 的使用需要注意的点还是非常多的,因而建议仅在值可能大于2^53 时使用 BigInt 类型。目前的兼容性一般,可以考虑使用 jsbi 这个库替代。

参考

JSBI — pure-JavaScript BigInts[4]

BigInt-MDN[5]

参考资料

[1]can i use: https://caniuse.com/?search=bigint

[2]JSBI — pure-JavaScript BigInts: https://github.com/GoogleChromeLabs/jsbi

[3]babel-plugin-transform-jsbi-to-bigint: https://github.com/GoogleChromeLabs/babel-plugin-transform-jsbi-to-bigint

[4]JSBI — pure-JavaScript BigInts: https://github.com/GoogleChromeLabs/jsbi

[5]BigInt-MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt

责任编辑:武晓燕 来源: 前端杂货铺
相关推荐

2022-06-13 07:36:06

2022-06-27 08:07:13

Go语言互斥锁

2022-06-10 17:37:37

数据库

2022-06-10 13:56:42

Java

2022-06-07 09:59:21

网络安全安全漏洞

2022-04-02 10:23:12

MySQL数据库

2022-05-23 11:03:53

云原生技术DockerIstio

2022-05-24 08:21:16

数据安全API

2022-06-08 13:48:06

物联网卡智能设备SIM卡

2022-05-17 08:39:05

VueViteTypeScript

2022-06-17 09:21:53

Pandas代码透视表

2022-05-16 07:35:21

Windows远程桌面远程服务器

2022-06-01 09:51:51

Golang方法接收者

2022-04-01 08:27:30

告警收敛运维监控

2022-05-31 06:01:00

WDM/OTN网络数据

2022-05-31 07:55:23

智能运维模型

2022-06-06 07:35:26

2022-06-27 09:54:38

编程语言JavaC++

2022-06-16 14:17:54

网络网速

2022-06-20 09:01:20

半导体芯片

同话题下的热门内容

手把手教你用装饰器扩展 Python 计时器哪个版本的JVM最快?无代码软件发展简史及未来趋势携程基于 GraphQL 的前端 BFF 服务开发实践为什么会存在 1px 问题?怎么解决?IOC-Golang 的 AOP 原理与应用Vue 里,多级菜单要如何设计才显得专业?远程医疗:优势、前景和现有IT解决方案

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号