JavaScript 的 Set 对超大 BigInt 天然支持精确去重,因使用 SameValueZero 算法且 BigInt 比较基于值语义;混入 Number 或字符串会导致去重失效,需统一类型并校验转换。

JavaScript 的 Set 对超大 BigInt 值天然支持去重,无需额外处理——只要数组元素全是合法的 BigInt(以 n 结尾或通过 BigInt() 构造),Set 就能正确识别并去重,哪怕数值大到超出 Number.MAX_SAFE_INTEGER(比如几十位甚至上百位的整数)。
BigInt 在 Set 中的相等性判断是精确的
Set 内部使用 SameValueZero 算法判断重复,而 BigInt 的相等比较是值语义(value-based),不是引用或近似。这意味着:
-
1234567890123456789012345678901234567890n === 1234567890123456789012345678901234567890n返回true - 即使两个
BigInt是不同变量、不同构造方式(如字面量 vsBigInt(str)),只要数值相同,Set就视为重复 - 不存在精度丢失问题——
BigInt本身不丢失精度,Set也不做任何隐式转换
常见误操作:混入 Number 或字符串会导致去重失效
如果数组里不小心混入了普通数字(Number)或表示大数的字符串,Set 不会自动转换,它们和 BigInt 被视为不同类型,无法去重:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
new Set([100n, 100])→ 大小为 2(100n !== 100) -
new Set([100n, "100"])→ 大小为 2(类型不同,值也不等) - 正确做法:确保所有元素统一为
BigInt类型
批量转 BigInt 并去重的安全写法
若原始数据是字符串数组(如从 JSON 或 API 获取的大数字符串),建议先校验再转换,避免 BigInt("abc") 报错:
立即学习“Java免费学习笔记(深入)”;
function safeDedupeBigNumbers(strArray) {
const bigInts = [];
for (const str of strArray) {
if (/^-?\d+$/.test(str)) { // 简单校验是否为纯数字字符串
try {
bigInts.push(BigInt(str));
} catch (e) {
console.warn(`跳过非法大数字符串: ${str}`);
}
}
}
return [...new Set(bigInts)];
}
// 示例
const raw = ["999999999999999999999999999999", "123", "999999999999999999999999999999"];
console.log(safeDedupeBigNumbers(raw));
// → [999999999999999999999999999999n, 123n]
内存与性能注意点
Set 存储超大 BigInt 不影响去重逻辑,但需留意:
- 每个
BigInt占用内存随位数增长(百位数BigInt可能占几 KB),大量超大数可能增加内存压力 - 插入/查找时间复杂度仍是平均 O(1),但单次哈希计算比小整数略慢(因需遍历所有字节)
- 如需频繁去重且数据量极大(百万级),可考虑分批处理或用更紧凑的序列化方式暂存

















