JS笔记《数据类型—BigInt》

19 阅读2分钟

概述

  • JS 所有数字都保存成 64 位浮点数,这给数值的表示带来了两大限制。一是数值的精度只能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JS是无法精确表示,这使得JS不适合进行科学和金融方面的精确计算。凡是大于或等于2的1024次方的数值,JS无法表示,会返回Infinity
// 超过 2 的 1024 次方的数值,无法表示
Math.pow(2, 1024) // Infinity

BigInt

  • ES2020引入了一种新的数据类型BigInt(大整数)。为了与Number类型区别,BigInt 类型的数据必须添加后缀n
const a = 2172141653n;
const b = 15346349309n;
  • BigInt与普通整数是两种值,它们之间并不相等。
42n === 42 // false
  • typeof返回bigint
typeof 1n  // 'bigint'
  • BigInt 可以使用负号(-),但是不能使用正号(+),因为会与 asm.js 冲突。
-42n // 正确
+42n // 报错

函数

  • BigInt函数可以用来生成BigInt类型的值,转换规则基本与Number()一致。
BigInt(123) // 123n
BigInt('123') // 123n
BigInt(false) // 0n
BigInt(true) // 1n

// 函数必须有参数,且参数必须可以正常转为数值
new BigInt() // TypeError
BigInt(undefined) //TypeError
BigInt(null) // TypeError  有点区别 Number(null)是不报错的
BigInt('123n') // SyntaxError
BigInt('abc') // SyntaxError

// 参数如果是小数也会报错
BigInt(1.5) // RangeError
BigInt('1.5') // SyntaxError

转换规则

  • 可以将BigInt转为布尔值、数值、字符串类型。
Boolean(0n) // false
Boolean(1n) // true
Number(1n)  // 1
String(1n)  // "1"  转为字符串时后缀n会消失

!1n // false
!0n // false

数学运算

  • +-***这四个运算符与Number类型的行为一致。除法运算/会舍去小数部分,返回一个整数。
123n + 12n  // 135n
9n / 5n     // 1n
1n + 1.3    // 报错   BigInt 不能与普通数值进行混合运算

其他运算

  • BigInt对应的布尔值与Number类型一致。
if (0n) {  // false
  console.log('if');
} else {
  console.log('else');  // else
}

0n < 1 // true
0n < true // true
0n == 0 // true
0n == false // true
0n === 0 // false

'' + 123n // "123"  与字符串混合运算时,会先转为字符串,再进行运算