前言
BigInt 这个新型数据类型,在去年的时候就有听说过,但没有真正的去了解。
对于这个 ES2020 的新特性,有哪些“过人之处”,这篇文章将会好好讲解一番。
1、概述
BigInt 是一个新型的内置类型,主要是为了表达大于 2^53-1 的整数。
我们定义一个 BigInt 类型的数据时有两种方式,第一个是在数字后面加 n,另外一种是调用 BigInt()方法。
let theBigInt = 9007199254740991n;
let alsoHuge = BigInt(9007199254740991); // 9007199254740991n
当用 typeof 对其进行类型判断时,返回的是 bigint。
let theBigInt = 9007199254740991n;
typeof theBigInt; // bigint
2、运算
BigInt 支持以下的运算符,+、*、-、**、% ,并且支持除了>>> (无符号右移)之外的 其他位运算符。
let previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
let maxPlusOne = previousMaxSafe + 1n; // 9007199254740992n
let maxMinusOne = previousMaxSafe - 1n; // 9007199254740990n
let multi = previousMaxSafe * 2n; // 18014398509481982n
let mod = previousMaxSafe % 10n; // 1n
值得注意的是,BigInt 是不支持单目+运算符的。
+previousMaxSafe; // Uncaught TypeError: Cannot convert a BigInt value to a number
主要原因还是 BigInt 无法和 Number 类型直接运算,如果想要运算的话必须在同一个类型上,但是有一点值得注意的是,当 BigInt 转为 Number 类型时,有可能会丢失精度。
在比较运算符中,BigInt 和 Nunber 类型的之间不是严格相等的。
10n == 10; // true
10n === 10; // false
Number 和 BigInt 是可以进行比较的。
1n < 2; // true
2n > 1; // true
2n >= 2; // true
3、API
BigInt 拥有两个静态方法:
- BigInt.asIntN(width, bigint):将 BigInt 值转换为一个-2^width-1 与 2^width-1-1 之间的有符号整数。
- BigInt.asUintN(width, bigint):将一个 BigInt 值转换为 0 与 2^width-1 之间的无符号整数。
这两个方法均接受两个参数,width:可存储整数的位数。bigint:要存储在指定位数上的整数。
const max = 2n ** (64n - 1n) - 1n;
BigInt.asIntN(64, max); // 9223372036854775807n
const max = 2n ** 64n - 1n;
BigInt.asUintN(64, max); // 18446744073709551615n
同时 BigInt 还拥有三个实例方法:
- BigInt.prototype.toLocaleString():返回此数字的 language-sensitive 形式的字符串。覆盖 Object.prototype.toLocaleString() 方法。
- BigInt.prototype.toString():返回以指定基数(base)表示指定数字的字符串。覆盖 Object.prototype.toString() 方法。
- BigInt.prototype.valueOf():返回指定对象的基元值。 覆盖 Object.prototype.valueOf() 方法。
let bigint = 3500n;
bigint.toLocaleString(); // "3,500"
bigint.toString(); // "3500"
bigint.valueOf(); // 3500n
总结
带你重学ES6系列到此就先按下暂停键了,今后ES6的新特性出来,这个系列依旧会更新,这段时间对ES6的总结让我学到了很多新的知识,努力吧!骚年!每个人都不容易,都是在为了更好的生活和理想努力奔跑,我只是希望不要掉队太多。🤩🤩🤩
后语
觉得还可以的,麻烦走的时候能给点个赞,大家一起学习和探讨!
相关文章:
- 带你重学ES6 | var、let和const的区别
- 带你重学ES6 | Promsie
- 带你重学ES6 | Generator
- 带你重学ES6 | Async和Await
- 带你重学ES6 | Set和Map
- 带你重学ES6 | Symbol(不仅仅只是一个新的数据类型)
- 带你重学ES6 | Export(谨记输出的都是变量)
- 带你重学ES6 | proxy和defineProperty
- 带你重学ES6 | Reflect
还可以关注我的博客希望能给我的github上点个Start,小伙伴们一定会发现一个问题,我的所有用户名几乎都与番茄有关,因为我真的很喜欢吃番茄❤️!!!
想跟车不迷路的小伙还希望可以关注公众号 前端老番茄 或者扫一扫下面的二维码👇👇👇。
我是一个编程界的小学生,您的鼓励是我不断前进的动力,😄希望能一起加油前进。