在前端开发中,数字运算是非常常见的操作,然而 JavaScript 所支持的常规数字类型是有限的,通常最大只能表示 $2^53$,这就导致在处理大量数据时会出现截断或精度问题。为了解决这样的问题,ES7 介绍了一种新的数字类型——BigInt.
BigInt 是什么?
BigInt 是一种用于表示任意长度整数的数据类型,它能够表示更大的整数而不会出现精度问题。在 ES7 中,BigInt 类型以后缀 n
表示。
BigInt 的使用
变量声明
在声明 BigInt 变量时,需要在数字结尾加上 n
后缀标识为 BigInt 类型:
const a = 1234567890123456789012345678901234567890n; const b = BigInt(1234567890123456789012345678901234567890);
运算符
在对 BigInt 类型进行运算时,只能使用 BigInt 相关的运算符。
算术运算符
常见的算术运算符(+、-、*、/、% 等)都支持在 BigInt 值上使用:
const a = 12345678901234567890n; const b = 98765432109876543210n; console.log(a + b); // 111111111111111111100n console.log(a - b); // -86419753208641975320n console.log(a * b); // 1219326311370217956612215533454089870000n console.log(b / a); // 799999999.2000000003761427668n console.log(b % a); // 1351499196003270390n
比较运算符
BigInt 类型的比较运算符和常规的比较运算符类似,也支持小于(<)、大于(>)、等于(=)、小于等于(<=)、大于等于(>=)以及严格相等(===)等运算符。
const a = 12345678901234567890n; const b = 98765432109876543210n; console.log(a < b); // true console.log(a > b); // false console.log(a === b); // false console.log(a <= b); // true console.log(a >= b); // false
位运算符
BigInt 类型支持的位运算符包括:按位与(&)、按位或(|)、按位异或(^)、左移位(<<)以及带符号右移位(>>)。
const a = 12345678901234567890n; const b = 98765432109876543210n; console.log(a & b); // 8536078132590499296n console.log(a | b); // 106710928052366192634n console.log(a ^ b); // 98126949519276193274n console.log(a << 3); // 98765432109876542976n console.log(b >> 2); // 24691358027469135802n
逻辑运算符
BigInt 类型支持的逻辑运算符包括:逻辑非(!)、逻辑与(&&)、逻辑或(||)。需要注意的是,BigInt 类型的逻辑与(&&)和逻辑或(||)并不支持 short circuit,即无法像普通数字那样实现断路功能。
const a = 12345678901234567890n; const b = 98765432109876543210n; console.log(!a); // false console.log(a && b); // 98765432109876543210n console.log(a || b); // 12345678901234567890n // 下面这种写法会报错 console.log(0n || 123n); // TypeError: Cannot perform logical OR with non-boolean
转换
在 BigInt 类型与其他数据类型进行运算时,需要先将其转换为统一类型。BigInt 类型与 Number 类型之间可以相互转换:
const a = 12345678901234567890n; console.log(Number(a)); // 1.2345678901234568e+19 console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 console.log(Number.MAX_SAFE_INTEGER < a); // true
需要注意的是,将 BigInt 转换为 Number 时可能会出现精度损失,因此需要谨慎使用。
BigInt 类型还可以用内置的 BigInt() 函数将其他类型的数据转换为 BigInt 类型:
const a = 12345678901234567890n; console.log(BigInt('12345678901234567890')); // 12345678901234567890n console.log(BigInt(123)); // 123n console.log(BigInt(Infinity)); // RangeError: Invalid BigInt value
示例代码
对于需要用 BigInt 处理的数据,比如处理账户金额,下面是一个简单的示例代码:
-- -------------------- ---- ------- --- ------- - ------------ -- ------- ------ -- --- ------ - ------------- -- ------- ------ ------- ------ ------- -- ------- -- -------- - ------- -- ------- ----------------------------------- - ---- - ------------------------- -
总结
BigInt 是一种用于表示任意长度整数的数据类型,解决了在处理大量数据时出现截断或精度问题,并且支持基本的算术、比较、位、逻辑运算和转换操作。在实际开发中需要合理使用 BigInt 类型,避免精度损失和性能问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461edca968c7c53b0343414