简介
JavaScript 作为一门流行的编程语言,经常会遇到需要处理大整数的情况。在以前的 ECMAScript 标准中,处理大数常常需要借助第三方库。但是,随着 ECMAScript 2021 的发布,现在可以使用内置的 BigInt 对象轻易地处理大数。
在本篇文章中,我们将会深入探讨 ECMAScript 2021 对 BigInt 的新特性,详细介绍大数的处理方法和应用场景,希望能够对读者有所帮助。
BigInt 的定义和创建
BigInt 对象表示任意大小的整数。与 Number 不同,BigInt 可以处理超出 JavaScript 限制数值范围的大数。在创建 BigInt 时需要添加后缀 n,以示这是 BigInt 类型。
const bigIntNum = 1234567890123456789012345678901234567890n;
需要注意的是,在将 BigInt 赋值给变量时,变量应该使用 let 或 const 声明,因为 BigInt 不能直接转换为普通的 Number。
const num = 123; // 普通的 Number 类型 const bigIntNum = 123n; // BigInt 类型 const value = num + bigIntNum; // 报错,无法将 BigInt 类型转换为 Number 类型
BigInt 的算术运算和比较
与普通的 Number 类型不同,BigInt 类型需要使用 BigInt 对象进行算术运算和比较。
// www.javascriptcn.com code example const a = 1234567890123456789012345678901234567890n; const b = 9876543210987654321098765432109876543210n; const sum = a + b; // 11111111111111111111111111111111111111100n const diff = a - b; // -8641975320864197532098765432108641975410n const prod = a * b; // 12193263113702179536469273483212353805946159486880702385174531493441367890123400n const quot = b / a; // 8n (向下取整) const isEqual = a === b; // false const isGreaterThan = a > b; // false const isLessThan = a < b; // true
需要注意的是,不能使用普通的 <, >, <=, >= 操作符直接比较 BigInt 和 Number 类型的值。但是可以使用比较运算符 ==, !=, ===, !== 对 BigInt 和 Number 进行比较,因为会在比较前将 BigInt 转换为 Number 类型。
BigInt 的运算方法
与普通的数字类型不同,BigInt 还有一些独特的运算方法。下面列出了一些常用的方法和使用示例。
toString 和 parseInt
toString 方法可以将 BigInt 转换为字符串类型。
const bigIntNum = 1234567890n; const str = bigIntNum.toString(); // "1234567890"
需要注意,仅将 BigInt 来源于字符串进行转换会导致错误。
const strNum = "1234567890" const bigIntNum = BigInt(strNum); // 1234567890n const wrongBigIntNum = BigInt(strNum.toString()); // wrong, TypeError: Cannot convert a Symbol value to a BigInt at BigInt
与之相反的,parseInt 可以将字符串转换为 BigInt。需要指定进制。
const strNum = "1234567890"; const bigIntNum = BigInt(parseInt(strNum)); // 1234567890n
十进制和二进制表示
toString 方法中可以指定转换后的进制,例如:
const bigIntNum = 1234567890n; const binStr = bigIntNum.toString(2); // "1001001100101100000001011010010" const hexStr = bigIntNum.toString(16); // "499602d2"
需要注意的是,在创建 BigInt 对象时,也可以使用二进制、八进制或十六进制表示。
const binNum = 0b10101010n; const octNum = 0o76543210n; const hexNum = 0xffn;
pow
pow 方法用于对 BigInt 进行幂运算。需要注意的是,当指数超出范围时会报错。
const bigIntNum = 1234n; const powResult = bigIntNum ** 3n; // 18608623904n
需要注意,使用 Math.pow 方法时会将 BigInt 转换为普通数值类型,因此不适用于 BigInt 运算。
mod
mod 方法用于取模运算。需要注意,当模数为 0 时会报错。
const bigIntNum = 1234567890n; const modResult = bigIntNum % 9876543210n; // 1234567890n
abs
abs 方法用于求取 BigInt 的绝对值。
const a = -1234567890123456789012345678901234567890n; const absResult = a.abs(); // 1234567890123456789012345678901234567890n
bit 位运算
BigInt 还可以使用二进制的位运算,包括按位与、按位或、按位异或等。需要注意的是,BigInt 中二进制数的最左侧为符号位,而不是普通的 2 的 63 次方。
// www.javascriptcn.com code example const a = 0b1010n; // 二进制:10 const b = 0b1100n; // 二进制:12 const andResult = a & b; // 8n(二进制:1000) const orResult = a | b; // 14n(二进制:1110) const xorResult = a ^ b; // 6n(二进制:0110) const notResult = ~a; // -11n(二进制:-1101) const leftShiftResult = a << 1n; // 20n(二进制:10100) const rightShiftResult = a >> 1n; // 5n(二进制:101)
需要注意,BigInt 还支持无符号右移运算符 >>>。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d7dd59a941bf7134e116fc