在 JavaScript 中,数字类型是最基础的数据类型之一。然而,由于 JavaScript 只支持 64 位整数,当我们需要处理超出这个范围的大整数时,就会出现精度丢失甚至运算错误的问题。为了解决这个问题,ECMAScript 2020 引入了一个新的数据类型:BigInt。
BigInt 的基本使用
BigInt 类型是一种用于表示任意精度整数的数据类型。与普通的数字类型不同,BigInt 类型可以表示任意长度的整数,而不会出现精度丢失的问题。在 JavaScript 中,我们可以使用后缀 n
来表示一个 BigInt 类型的数字。
const a = 9007199254740991n; const b = BigInt("9007199254740991"); const c = 10n; console.log(typeof a, typeof b, typeof c); // "bigint" "bigint" "bigint"
在上面的代码中,我们分别使用了数字字面量和 BigInt()
函数来创建 BigInt 类型的数字。需要注意的是,普通的数字类型和 BigInt 类型是不同的数据类型,它们之间不能进行直接的运算。
const a = 9007199254740991; const b = 9007199254740991n; console.log(a + b); // TypeError: Cannot mix BigInt and other types
在上面的代码中,我们试图将一个普通的数字类型和一个 BigInt 类型相加,结果会抛出一个类型错误。
BigInt 的运算
BigInt 类型支持与普通的数字类型和其他 BigInt 类型的运算。在进行运算时,如果其中一个操作数是 BigInt 类型,那么结果也会是 BigInt 类型。否则,结果将转换为普通的数字类型。
const a = 9007199254740991n; const b = 10; console.log(a + b); // 9007199254741001n
在上面的代码中,我们将一个 BigInt 类型的数字和一个普通的数字类型相加,结果会自动转换为 BigInt 类型。
除了基本的算术运算符(+
、-
、*
、/
、%
),BigInt 类型还支持位运算符(<<
、>>
、>>>
、&
、|
、^
、~
)和逻辑运算符(&&
、||
、!
)等。
BigInt 的限制和注意事项
虽然 BigInt 类型可以表示任意长度的整数,但是它并不是无限制的。在实际使用中,我们需要注意以下几点:
带有
n
后缀的数字字面量不能使用科学计数法表示。const a = 1e100n; // SyntaxError: Invalid or unexpected token
BigInt 类型不能与普通的数字类型进行混合运算,需要显式地进行类型转换。
const a = 9007199254740991n; const b = 10; console.log(Number(a) + b); // 9007199254741001
BigInt 类型不能与字符串进行自动类型转换,需要使用
BigInt()
函数显式地进行转换。const a = 9007199254740991n; const b = "10"; console.log(a + BigInt(b)); // 9007199254741001n
BigInt 类型不能用于
Math
对象中的方法和属性。const a = 9007199254740991n; console.log(Math.abs(a)); // TypeError: Cannot convert a BigInt value to a number
BigInt 的应用场景
BigInt 类型的引入为处理大整数运算提供了方便和高效的解决方案,特别是在密码学、加密、安全哈希等领域中具有重要意义。下面是一个使用 BigInt 类型计算斐波那契数列的示例代码:
function fibonacci(n) { let a = 0n; let b = 1n; for (let i = 0; i < n; i++) { [a, b] = [b, a + b]; } return a; } console.log(fibonacci(100)); // 354224848179261915075n
在上面的代码中,我们使用 BigInt 类型来保存斐波那契数列中的每一个数字,避免了精度丢失的问题。
总结
ECMAScript 2020 引入了 BigInt 类型,为 JavaScript 中处理大整数运算提供了方便和高效的解决方案。BigInt 类型支持任意长度的整数,可以与普通的数字类型和其他 BigInt 类型进行运算。在实际使用中,我们需要注意 BigInt 类型的限制和注意事项,避免出现意外的错误。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b088b2add4f0e0ff9e3ead