在ECMAScript 2020 (ES11)的新特性中,我们看到了BigInt。BigInt是一种新的基本数据类型,用于表示任意大的整数。在过去,JavaScript 中最大的整数是2^53-1,但现在Javascript可以表示任意大的整数。
为什么需要 BigInt?
当我们在进行数学运算的时候,可能会涉及到很大的数字,而原生 Number 类型只能表示[-9007199254740991, 9007199254740991]之间的整数。对于超出这个范围的数字,我们无法进行运算。因此,BigInt应运而生,它能够处理任意大小的整数,没有上限。
如何创建 BigInt?
在Javascript 中,我们可以使用带 n 后缀的数字字面量或者使用 BigInt() 函数来创建 BigInt 对象。
例如:
let foo = 1234567890123456789012345678901234567890n; let bar = BigInt("1234567890123456789012345678901234567890");
BigInt类型的运算
我们可以使用与普通数值类型相同的运算符,例如加、减、乘和除等来处理BigInt对象。
例如:
const a = 12345678901234567890n; const b = 9876543210987654321n; console.log(a + b); // 22222222112222222211n console.log(a * b); // 121932631137021795675260189280013209110n console.log(b - a); // 8641975308641975309n console.log(b / a); // 0n
需要注意的是,当使用除法运算符 / 时,BigInt 类型的结果将向下取整,因此结果可能为0。
BigInt 与 JSON 序列化
BigInt 并未被包含在 JSON 标准中。因此,当我们需要将 BigInt 转换为 JSON 时,我们需要进行一些额外的处理。
在 ECMAScript 2020 (ES11) 中,我们可以使用 JSON.stringify() 方法的 replacer 函数或 reviver 函数来处理 BigInt 的序列化和反序列化。
自定义序列化器 (replacer)
在序列化过程中,如果我们希望将 BigInt 转换为字符串而不是在序列化期间将其舍弃,则可以在 JSON.stringify() 函数中传入一个 replacer 函数。我们可以使用该函数将 BigInt 替换为其字符串表示。
例如:
-- -------------------- ---- ------- ----- ---- - - --- --- ----- ------- ---------- --- ------ -- ----- ---------- - -------------------- ------------- ------ - ------ ------ ----- --- -------- - ---------------- - ------ --- ------------------------
上面的代码将 1n 转换为了字符串 "1"。
自定义反序列化器 (reviver)
在反序列化时,当我们需要将 JSON 字符串中的字符串转换回 BigInt 时,我们可以传递一个 reviver 函数来反序列化 BigInt 类型的值。
例如:
const jsonString = '{ "id": "1", "name": "John", "last_seen": "2021-07-10T09:30:00.000Z" }'; const data = JSON.parse(jsonString, function(key, value) { return key === "id" ? BigInt(value) : value; }); console.log(data.id); // 1n
在例子中,我们使用 reviver 函数将字符串 "1" 转换回了 BigInt 类型的数字 1n。
结论
在 ECMAScript 2020 (ES11) 中,BigInt 是一项强大而实用的新特性。它可以处理数字运算中的大数字,并且可以通过一些技巧将 BigInt 转换为 JSON 格式。我们可以使用 BigInt 来处理一些需要处理更大数字的问题,例如加密等。
总之,了解 BigInt 类型并使用它来处理较大的数字非常重要。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6752c5858bd460d3ad9844ee