用 bigint 类型配合字符串输入、显式转换和类型隔离是最直接且标准的安全方案;需校验安全整数、字符串初始化 bigint、禁止与 number 混用、输出前手动转字符串。

用 BigInt 类型,配合字符串输入、显式转换和类型隔离,是最直接且标准的安全方案。
明确识别哪些数已超出安全范围
JavaScript 的安全整数边界是 ±9007199254740991(即 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER)。超出后,加减 1 可能无效,相等判断会出错。例如:
-
9007199254740992 === 9007199254740993返回true(错误) - 后端传来的 19 位 ID(如
"1234567890123456789")被 JS 自动转成 number 后,可能变成1234567890123456800
接收数据时优先调用 Number.isSafeInteger(x) 校验,尤其对 API 响应、表单输入或 URL 参数中的数字。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用字符串初始化 BigInt,避免解析阶段精度丢失
不能写 123456789012345678901234567890n 字面量——因为 JS 解析器会先尝试按 number 解析,超限后已失真。正确做法是:
- 从后端返回的 JSON 中,把大整数字段定义为字符串:
{"id": "1234567890123456789"} - 再用
BigInt("1234567890123456789")创建,确保原始值无损 - 注意:
BigInt(1234567890123456789)不安全,因为传入的 number 参数本身可能已不精确
运算中坚持类型统一,禁止与 number 混用
BigInt 和 number 是完全隔离的类型,任何混合运算都会抛 TypeError:
- ❌
1n + 2、5n > 4、BigInt("10") / 3都非法 - ✅
1n + 2n、BigInt("10") > BigInt("9")、10n % 3n才合法 - 除法
/会向零截断(如5n / 2n === 2n),不支持小数结果;需取余用%,幂运算用**
输出与序列化前必须手动处理类型
BigInt 无法直接用于 DOM 渲染、JSON 序列化或大多数内置方法:
- 显示时用
.toString():例如document.textContent = bigId.toString() - JSON 序列化需自定义
replacer:JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v) - 不支持
Math方法、.toFixed()、parseInt()等,需自行实现或换用第三方库(如bignumber.js)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










