JavaScript中的BigInt


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2020/06/04/JavaScript%E4%B8%AD%E7%9A%84BigInt/

摘要

本文主要讲述了:

  1. 什么是bigint型值
  2. 作用
  3. 字面量
  4. 类型转换
  5. 计算
  6. 原型方法
  7. 静态方法

正文

什么是bigint型值

bigint是 ES2020 中新增的一种原始类型,其构造函数为BigInt

示例:

1
console.log(BigInt);

Symbol()一样,BigInt()不能用作构造函数

作用

number只能精确表示[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]区间的整数

示例:

1
2
3
4
5
// true
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2;

// true
Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2;

bigint可以表示任意大的整数

示例:

1
2
3
4
5
// false
BigInt(Number.MAX_SAFE_INTEGER) + 1n === BigInt(Number.MAX_SAFE_INTEGER) + 2n;

// false
BigInt(Number.MIN_SAFE_INTEGER) - 1n === BigInt(Number.MIN_SAFE_INTEGER) - 2n;

字面量

在数字的末尾增加一个n

示例:

1
1n;

bigint也可以用二进制、八进制、十六进制表示

1
2
3
4
5
6
7
8
// 2n,二进制
0b10n;

// 8n,八进制
0o10n;

// 16n,十六进制
0x10n;

类型转换

1
2
// "bigint"
typeof 1n;

其他类型转换成 bigint

只有numberstringbooleanArrayDate有可能转换成bigint

注意:调用BigInt()必须提供参数

示例:

1
2
3
4
5
6
7
8
// 0
Number();

// 报错
BigInt();

// 0n
BigInt(0);

number

示例:number -> bigint

1
2
3
4
5
6
7
8
// 0n
BigInt(0);

// 0n
BigInt(+0);

// 0n
BigInt(-0);

浮点数和NaN不可被转换为bigint

1
2
3
4
5
6
7
8
// 报错
BigInt(1.2);

// "number"
console.log(typeof NaN);

// 报错
BigInt(NaN);

string

示例:string -> bigint

1
2
// 1n
BigInt('1');

不能被Number()转换为number型的字符串同样不能被BigInt()转换为bigint

示例:

1
2
3
4
5
6
7
8
// 报错
Number('1abc');

// 1
Number.parseInt('1abc', 10);

// 报错
BigInt('1abc');

boolean

1
2
3
4
5
6
7
8
9
10
11
// 1
Number(true);

// 0
Number(false);

// 1n
BigInt(true);

// 0n
BigInt(false);

undefined

1
2
3
4
5
// NaN
Number(undefined);

// 报错
BigInt(undefined);

null

1
2
3
4
5
// 0
Number(null);

// 报错
BigInt(null);

symbol

1
2
3
4
5
// 报错
Number(Symbol());

// 报错
BigInt(Symbol());

Array

1
2
3
4
5
// 0
Number([]);

// 0n
BigInt([]);

Date

1
2
3
4
5
// 1585478834593
Number(new Date());

// 1585478834593n
BigInt(new Date());

RegExp

1
2
3
4
5
// NaN
Number(new RegExp());

// 报错
BigInt(new RegExp());

Object

1
2
3
4
5
// NaN
Number({});

// 报错
BigInt({});

function

1
2
3
4
5
// NaN
Number(function () {});

// 报错
BigInt(function () {});

bigint 转换成其他

bigint可以转换为numberstringbooleanArrayRegExp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 1
Number(1n);

// "1"
String(1n);

// "1"
1n.toString();

// true
Boolean(1n);

// true
Boolean(-1n);

// false
Boolean(0n);

// false
Boolean(-0n);

// true
!0n;

// false
!1n;

// []
Array.from(1);

// []
Array.from(1n);

// 1970-01-01T00:00:00Z
new Date(0);

// 报错
new Date(0n);

// /1/
new RegExp(1n);

// 包装对象
Object(1n);

// 报错
JSON.stringify(1n);

计算

由于+运算的返回值为number型。如果传入bigint结果就会造成精度损失,故bigint无法使用+

1
2
3
4
5
// 报错
+1n;

// -1n
-1n;

由于Math静态方法的返回值为number。如果传入bigint结果就会造成精度损失,故bigint无法使用Math的静态方法

示例:

1
2
3
4
5
// 报错
Math.max(1n, 2n);

// 报错
Math.pow(2n, 3n);

同理,bigint不得与number进行计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 报错
1n + 1;

// 报错
1n - 1;

// 报错
1n * 1;

// 报错
1n / 1;

// 报错
1n % 1;

bigint在做除法运算时会向0取整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 2n
1n + 1n;

// 0n
1n - 1n;

// 1n
1n * 1n;

// 向`0`取整
// 2n
5n / 2n;

// 向`0`取整
// -2n
-5n / 2n;

// 1n
5n % 2n;

// 1n
5n % -2n;

// -1n
-5n % 2n;

// -1n
-5n % -2n;

bigint不得使用>>>(无符号右移)

1
2
3
4
5
// 25
100 >>> 2;

// 报错
100n >>> 2n;

因为比较不会造成精度损失,故bigint可与number进行大小比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// true
1n == 1;

// false
1n === 1;

// true
2n > 1;

// true
1n < 2;

// true
2n >= 2;

// true
2n <= 2;

原型方法

valueOf()

返回其自身

1
2
// 1n
1n.valueOf();

toString()

转换为字符串

1
2
// "1"
1n.toLocaleString();

toLocaleString()

转换为区域字符串

1
2
// "1"
1n.toLocaleString();

静态方法

asUintN()

把指定的bigint型数值模拟成指定二进制位数下的无符号整数

示例:把255n256n模拟成8位二进制位数下的无符号整数

8 个二进制位最多能表示[0, 0b11111111],即[0, 255]

用来表示无符号整数时,可以表示[0, 255]

1
2
3
4
5
// 255n
BigInt.asUintN(8, 255n);

// 0n,溢出
BigInt.asUintN(8, 256n);

asIntN()

把指定的bigint型数值模拟成指定二进制位数下的有符号整数

示例:把127n128n模拟成8位二进制位数下的有符号整数

8 个二进制位最多能表示[0, 0b11111111],即[0, 255]

用来表示有符号整数时,可以表示[-128, 127],其中[0, 0b01111111]用于表示[0, 127][0b10000000, 0b11111111]用于表示[-128, -1]

1
2
3
4
5
// 127n
BigInt.asIntN(8, 127n);

// -128n,溢出
BigInt.asIntN(8, 128n);

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2020/06/04/JavaScript%E4%B8%AD%E7%9A%84BigInt/


本文对你有帮助?请支持我


支付宝
微信