你有没有试过在ref="/tag/53/" style="color:#2B406D;font-weight:bold;">浏览器控制台里输入 0.1 + 0.2,结果弹出 0.30000000000000004?一脸懵?别急,这跟 JavaScript 里“整数”压根不是独立类型有关——它所有数字都用 64 位双精度浮点数(IEEE 754)存,连 42 这种纯整数也不例外。
不是“整数类型”,是“整数值”
JS 没有 int、long、short 这类 C 风格的整数类型。所谓“整数”,只是指 Number 类型中值为整数的那些数字,比如 100、-5、0。它们在内存里照样走浮点数那套:1 位符号位 + 11 位指数位 + 52 位尾数位。
举个例子:9007199254740992(也就是 2^53)能精确表示,但加 1 后的 9007199254740993 就不行了:
console.log(9007199254740992); // 9007199254740992
console.log(9007199254740992 + 1); // 9007199254740992(没变!)
console.log(9007199254740992 + 2); // 9007199254740994(跳过了奇数)这就是常说的“安全整数上限”(Number.MAX_SAFE_INTEGER === 9007199254740991)的由来——超过它,连续整数就保不住了。
那 BigInt 是啥?
ES2020 引入了 BigInt,专为大整数设计,用 n 结尾,比如 123n。它不走浮点规则,而是按需分配内存,能精确表示任意大的整数:
const big = 9007199254740991n + 1n;
console.log(big); // 9007199254740992n
console.log(big === 9007199254740992n); // true但注意:BigInt 和 Number 不兼容,不能混算:1n + 2 会直接报错。
日常开发咋办?
大多数时候,你根本不用操心存储细节。写 for (let i = 0; i < 100; i++) 安全得很;处理 ID、计数器、年份,只要不超过 2^53,也完全没问题。真遇到超大整数(比如区块链地址、天文数据),再切到 BigInt 或字符串方案。
顺手一提:Chrome DevTools 里右键数字 → “Store as global variable”,生成的变量名像 temp1,它的值在控制台里显示为整数,背后还是那个 64 位浮点结构——你看不见,但它一直在那儿。