我们知道,面试现在 JavaScript 有 7 种基础类型,官聊null/undefined/number/string/boolean/bigint/symbol。面试其中 bigint 是官聊 ES2020 中正式加入的,有个别的面试面试官喜欢深挖这个特性,那么我们来了解一下 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); typeof 检测 BigInt 对象返回 bigint 字符串。面试 typeof 1n === bigint; // truetypeof BigInt(1) === bigint; // true BigInt 很多时候表现跟 Number 类型很像,官聊但也有很多不同的面试点,这些点在用到 BigInt 类型的时候,需要思考以下的点: 运算: 语法点 支持度 备注 +、*、-、**、服务器托管% 支持 / 不支持 会进行向下取整 单目 (+) 运算符 不支持 >>>(无符号右移) 不支持 因为 BigInt 都是有符号的 位运算(除了无符号右移) 支持 Math 对象方法 不支持 说明: 除法的时候,当使用 BigInt 时,带小数的运算会被取整const expected = 4n / 2n; // ↪ 2n const rounded = 5n / 2n; // ↪ 2n, not 2.5n 综上所述,可以看到 BigInt 的使用需要注意的点还是非常多的,并且在和 Number 类型转换的时候还会发生精度丢失问题,因而建议仅在值可能大于2^53 时使用 BigInt 类型。 那么 BigInt 现在有哪些应用场景呢? 大于 2^53 - 1 的整数的一个应用场景就是高精度时间戳。精确到纳秒级别的时间戳很常见,经常用来记录特定程序的执行事件,以便进行性能分析,BigInt 可以表示高精度时间戳,云南idc服务商在后端性能分析、性能调优中发挥作用。 比如 Twitter 的 id 生成服务,当 id 持续增长时,就会超出 JS 的安全范围,因此要求同时冗余地返回字符串型的 id。假如有 BigInt 类型就可以直接使用。 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/BigIntBigInt 是什么?
概念BigInt 基础语法和注意点
BigInt 的应用场景
高精度时间戳兼容性 & PolyFill
总结
参考