JavaScript BigInt 详解:特性、用法与注意事项

作者:闭包旅人

时间:2026-10-31

浏览:124

本文深入解析 JavaScript 新增的基本类型 BigInt,阐述其解决 Number 类型精度丢失问题的核心机制。详细讲解 BigInt 的创建方式、支持的数学与位运算规则、与普通数字的交互限制及类型转换方法。同时通过代码示例验证 BigInt 与 Math 对象的不兼容性、混合运算的 TypeError 异常以及比较操作的隐式转换行为,帮助开发者在密码学、金融计算等场景中安全使用大整数。

文章目录

前言

BigInt 是 JavaScript 语言中引入的一种全新基本数据类型,旨在处理任意精度的整数。当数值规模超出 Number 类型所能安全表示的范围时,BigInt 能够确保数据的完整性和操作的准确性。

JavaScript 中的普通数字基于 IEEE 754 双精度浮点格式存储,其安全整数范围限制在 -(2^53 - 1) 到 2^53 - 1 之间,即 -9007199254740991 至 9007199254740991。超出此范围的整数在计算或存储时极易发生精度丢失。BigInt 的引入正是为了解决这一 Number 类型在大整数表示上的局限性。

BigInt 允许开发者表示和操作大于 2^53 - 1 的整数,且全程保持精度无损。需要注意的是,BigInt 是一个内置对象类型,而非特定的字面量语法。开发者可以通过调用 BigInt() 构造函数将整数或字符串转换为 BigInt,也可以在数字字面量后添加 'n' 后缀来直接创建 BigInt 实例。

一、BigInt 特性

1. 无符号与任意长度

BigInt 表示的是无符号整数,其长度不受固定位数(如 64 位或 128 位)的限制,而是由内存空间决定。这意味着它可以存储极大数值的整数,例如超过 10^100 的数字,远超普通整数类型的存储能力。

2. 运算支持

BigInt 支持标准的数学运算,包括加法、减法、乘法和除法。关键在于,这些运算仅在 BigInt 值之间进行时才有效,且不会导致精度损失或溢出。若涉及不同类型运算,系统会强制要求类型转换以保障精度。

3. 类型转换

当 BigInt 需要与普通数字(Number 类型)进行交互时,必须执行显式的类型转换。由于两者属于不同的数据类型,JavaScript 不允许直接混合使用,需通过构造函数或字面量语法进行明确转换。

4. 应用场景广泛

凭借处理超大整数的能力,BigInt 在计算机科学领域应用广泛。例如在密码学中用于生成加密密钥,在大数据分析中处理海量数据,以及在自然数值域、金额货币计算、计数器、唯一标识符和时间戳等场景中发挥重要作用,极大地拓展了前端技术的应用边界。

二、BigInt 的使用

1. 创建 BigInt

代码如下(示例):

const bigInt1 = BigInt("12345678901234567890"); // 使用字符串创建 BigInt  
const bigInt2 = 12345678901234567890n; // 使用数字字面量后缀 n 创建 BigInt

2. BigInt 运算

BigInt 支持加(+)、减(-)、乘(*)、除(/)、取模(%)等基本算术运算,同时也支持位运算,如按位与(&)、按位或(|)、按位异或(^)等:

const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210);  
//console.log(sum)   111111111011111110656n
const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210);  
//console.log(diff)  -86419753208641976320n
const product = BigInt(12345678901234567890) * BigInt(98765432109876543210);
//console.log(product) 1219326311370217884360920552323609001984n

关于除法运算,BigInt 会返回一个 BigInt 类型的商,任何小数部分均会被直接舍去。若需获取余数,应使用取模运算符(%):

const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210);  
//console.log(sum)   111111111011111110656n
const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210);  
//console.log(diff)  -86419753208641976320n
const product = BigInt(12345678901234567890) * BigInt(98765432109876543210);
//console.log(product) 1219326311370217884360920552323609001984n

3. 与普通数字的交互

BigInt 和普通数字(Number 类型)是两种独立的数据类型,严禁直接进行混合运算,否则 JavaScript 引擎会抛出错误。开发者需使用 BigInt() 构造函数或字面量后缀 'n' 进行显式类型转换:

const regularNumber = 123;  
const bigNumber = BigInt(123);  
  
// 错误的用法,会抛出 TypeError  
// const result = regularNumber + bigNumber;  
//Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions at <anonymous>:1:30
  
// 正确的用法,显式转换类型  
const result = BigInt(regularNumber) + bigNumber;
//console.log(result)
// 246n

4. 比较操作

可以使用比较运算符(如 >、<、==、!=、>=、<=)对 BigInt 值进行比较。但在与普通数字比较时,需确保至少有一个操作数为 BigInt 类型:

const bigInt1 = BigInt(123);  
const bigInt2 = BigInt(456);  
const regularNumber = 789;  
  
console.log(bigInt1 < bigInt2); // true  
console.log(bigInt1 < BigInt(regularNumber)); // true  
 console.log(bigInt1 < regularNumber); // true,这里理论上应该报错,实际不会报错,因为是js机制的隐式转换,只限于比较

在表达式 bigInt1 < regularNumber 中,理论上可能引发类型错误,但实际执行并未报错。这是由于 JavaScript 引擎在比较操作中引入了隐式转换机制(具体原理可参考相关文档),该机制仅适用于比较场景,开发者可通过实验验证这一行为。

补充:使用 BigInt 时的注意点

使用大数时需关注以下限制:

  1. BigInt 类型无法与内置 Math 对象配合使用。
  2. BigInt 不能与 Number 类型直接进行算术运算,仅支持与同为 BigInt 类型的数值进行运算。
  3. BigInt 可以与 Number 类型进行比较操作。
  4. BigInt 无法转换为小数,仅能转换为整数。若传入非数字类型(如布尔值或空数组 []),内部会尝试将其转换为数字,若转换失败则抛出错误。

验证例子 1: n1 为 bigint, n2 为数字, 使用 Math.pow() 函数来求两者的平方

    const n1 = 10n;
    try {
      console.log(Math.pow(n1, 2));
    } catch (error) {
      console.log(error);
    }
    const n2 = 10;
    console.log(Math.pow(n2, 2));

前言

可以看到确实大数不能和 math 相关函数配合使用

验证例子 2: 使用大数和 number 进行运算和比较

    const n1 = 10n;
    const n2 = 20;
    try {
      console.log(n1 + n2);
    } catch (error) {
      console.log(error);
    }
    console.log(n1 + BigInt(n2));
    console.log(n1 > n2);

前言

结果大数不能和 number 进行运算, 可以和 number 进行比较

验证例子 3: BigInt 不能转小数

    try {
      console.log(BigInt(22.22));
    } catch (error) {
      console.log(error);
    }

前言

报错内容大概是不能转换成 bigint 因为他不是个整数

总结

1、BigInt 类型的值不能和普通数字混合使用,除非进行显式的类型转换(比较是例外)。

2、BigInt 不支持一些 Number 类型的方法,如 Math 对象中的大多数函数。你需要寻找适合 BigInt 的替代方案。

3、并非所有环境都支持 BigInt。确保你的代码运行在支持 BigInt 的 JavaScript 引擎中。

4、BigInt 的引入使得 JavaScript 在处理大整数时更加灵活和强大,特别是在需要精确表示和计算大整数的场景中,如加密、科学计算等。

到此这篇关于js新增基本类型BigInt的文章就介绍到这了,更多相关js新增基本类型BigInt内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章