我们知道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。如下:consttheBiggestInt=9007199254740991n;constalsoHuge=BigInt(9007199254740991);//?9007199254740991n类型检测typeof检测BigInt对象返回一个bigint字符串。typeof1n==='bigint';//truetypeofBigInt('1')==='bigint';//trueBigInt基本语法和注意点BigInt在很多情况下与Number类型非常相似,但也有很多不同之处,这些要点在BigInt类型中使用时,需要考虑以下几点:操作:语法点支持备注+,*,-,**,%支持/不支持将一元(+)运算符向下舍入不支持>>>(无符号右移)不支持因为BigInt是有符号位操作(无符号右移除外))支持Math对象方法不支持说明:当使用BigInt做除法时,带小数的运算会四舍五入constexpected=4n/2n;//?2nconstrounded=5n/2n;//?2n,not2.5nmixedwith数字。必须转换成相同的类型,有时可能会造成精度损失,所以不推荐使用这个。在对象中使用BigInt时,如果使用了JSON.stringify(),会出现类型错误(TypeError)。综上,可以看到使用BigInt还有很多需要注意的地方,用Number类型转换会出现丢精度的问题,所以建议只在值可能大于2的时候才使用BigInt类型^53。那么现在BigInt的应用场景有哪些呢?BigInt的应用场景是高精度时间戳。大于2^53-1的整数的一个应用场景是高精度时间戳。精确到纳秒级的时间戳非常普遍,常用于记录特定程序的执行事件,以供性能分析。BigInt可以表示高精度的时间戳,起到后端性能分析和性能调优的作用。大整数id,比如twitter的id生成服务,当id不断增长的时候会超出JS的安全范围,所以需要同时冗余的返回一个string类型的id。如果有BigInt类型,可以直接使用。Compatibility&PolyFillcaniuse[1]中的数据显示,Chrome的支持会好很多,IE被彻底淘汰,整体覆盖92.25%的用户。BigInts现在可以使用JSBI—纯JavaScriptBigInts[2]库来实现。JSBI直接使用了V8和Chrome中BigInt的设计和实现。功能与浏览器中相同,只是语法略有不同。如果所有浏览器都原生支持BigInt,您可以使用babel插件babel-plugin-transform-jsbi-to-bigint[3]移除JSBI并将其转换为原生BigInt语法。总结一般来说,BigInt可以表示任意大的整数,目前使用场景比较少。使用BigInt还有很多需要注意的地方,所以建议只有当值可能大于2^53时才使用BigInt类型。目前兼容性一般,可以考虑改用jsbi库。参考JSBI—pure-JavaScriptBigInts[4]BigInt-MDN[5]References[1]我可以使用:https://caniuse.com/?search=bigint[2]JSBI—pure-JavaScriptBigInts:https://github.com/GoogleChromeLabs/jsbi[3]babel-plugin-transform-jsbi-to-bigint:https://github.com/GoogleChromeLabs/babel-plugin-transform-jsbi-to-bigint[4]JSBI——纯-JavaScriptBigInts:https://github.com/GoogleChromeLabs/jsbi[5]BigInt-MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
