在 ES10 中,除了一些小的改进和新增的方法之外,还引入了一种新的数据类型:BigInt。BigInt 类型用于表示超过Number.MAX_SAFE_INTEGER
的整数值,这意味着可以在不丢失精度的情况下进行大数字计算。
BigInt 类型的基本介绍
BigInt 类型是 ES10 中新增的数据类型,它用于表示超过 JS 的 Number.MAX_SAFE_INTEGER
(即 2^53-1)的整数值。BigInt 是一个对象类型,可以使用 BigInt()
函数来创建一个 BigInt 类型的值。BigInt 类型的值必须以 n 结尾,如下所示:
const bigIntValue = 1234567890123456789012345678901234567890n;
BigInt 类型使用类似于其他 JavaScript 数据类型的运算符来进行算术操作。
const a = 4323n; const b = 96802n; console.log(a + b);// Logs 101125n console.log(b - a);// Logs 92479n console.log(a * b);// Logs 418101546n console.log(b / a);// Logs 22n
从上面的示例中可以看出,BigInt 类型的算术操作与其他 JavaScript 数据类型的操作非常相似。但是请注意,除以 BigInt 值的任何运算将向下取整并返回 BigInt 值。
BigInt 与 Number 类型的比较
由于 BigInt 和 Number 类型之间的差异非常大,因此在进行比较时需要非常小心。BigInt 值和 Number 值之间可以进行相等性和不相等性比较。但是,请记住,BigInt 值和没有 n 结尾的数字文本(例如 "42")之间不会进行任何比较,它们将始终不相等。另外,请注意,当使用 >、<、>= 或 <= 运算符进行比较时,BigInt 值将被强制转换为 Number 值。一个例子如下:
console.log(22n == 22); //Logs true console.log(22n === 22); //Logs false console.log(22n > 0); //Logs true console.log(22n < 0); //Logs false
BigInt 与常规数字之间的转换
由于 BigInt 与其他 JavaScript 数据类型在内存分配和处理方面的差异非常大,因此将 BigInt 值转换为数字类型的操作需要特别小心。但是,一些情况下还是需要进行类型转换。在 BigInt 值和 Number 值之间进行相互转换的方法如下:
- BigInt 转为 Number:
const bigIntValue = 9007199254740995n; const bigIntConverted = Number(bigIntValue); // Returns 9.007199254740995e+15
- Number 转为 BigInt:
const numberValue = 9007199254740995; const numberConverted = BigInt(numberValue); // Returns 9007199254740995n
请注意,如果将一个非常大的 BigInt 值转换为 Number 值,则可能发生截断或精度丢失。同样,将 Number 值转换为 BigInt 类型时,则可能会发生溢出。
实际应用
现实应用中,BigInt 函数常常用于处理处理非常大的数据,如加密和科学计算中的算法。我们来看一个例子:
//使用BigInt类计算斐波那契数列中的100个数字,其中第一、第二个数字为1 let fib = [1n, 1n]; for (let i = 2; i < 100; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } console.log(fib); //Logs an array of 100 BigInt values
由于斐波那契数列具有指数级增长,因此在处理大量数字时需要使用 BigInt。使用常规数字类型无法处理大于 2^53 - 1 的数字,会导致精度丢失或截断。
总结
ES10 的 BigInt 类型使得 JavaScript 可以处理超出 Number 值范围的数字,从而提供了更广阔的数学计算领域。BigInt 类型可以与常规数字类型进行相互转换,需要注意的是在类型转换和运算过程中需要特别小心。在实际开发中,了解 BigInt,可以更好地处理大规模数学计算问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cf0765b5eee0b525684686