在数字字面量中使用下划线 _ 作为分隔符,让大数字更易阅读。30_000 等价于 30000,不影响值本身。ES2021 正式标准,可放心用于日常开发。
语法
在数字的任意两个数位之间插入 _ 即可。
const billion = 1_000_000_000; // 1000000000
const price = 1_050.95; // 1050.95
const hex = 0xA0_B0_C0; // 10531008
const binary = 0b1010_0001; // 161
const octal = 0o2_2_5_6; // 1198
const bigInt = 1_000_000n; // 1000000n
分隔符纯粹是视觉辅助,引擎解析时会忽略它。30_000 === 30000 为 true。
使用规则
| 规则 | 合法示例 | 非法示例 |
|---|---|---|
| 只能放在数位之间 | 1_000 | _1000、1000_ |
| 不能连续使用多个 | 1_000_000 | 100__000 |
不能紧跟前导 0 | 0x1_0 | 0_1 |
| 不能放在小数点旁 | 1_000.5 | 1_.5、1._5 |
违反规则会抛出 SyntaxError。
适用的数字类型
- 十进制:
1_000_000 - 十六进制:
0xFF_FF - 二进制:
0b1111_0000 - 八进制:
0o77_77 - BigInt:
1_000n - 浮点数:
1_234.567_8
常见陷阱
parseInt 和 Number 无法解析含 _ 的字符串
数字分隔符只在源代码字面量中有效,不适用于字符串解析。
parseInt("123_456"); // 123(在 _ 处停止解析)
Number("123_456"); // NaN
要解析含分隔符的字符串,先移除下划线:
Number("123_456".replaceAll("_", "")); // 123456
JSON 不支持数字分隔符
JSON.parse('{ "value": 1_000 }'); // SyntaxError
规范与浏览器兼容性
ECMAScript 规范: Numeric Separators(ES2021 / ES12 正式纳入)
提案: tc39/proposal-numeric-separator(Stage 4)
| 运行环境 | 最低版本 |
|---|---|
| Chrome | 75 |
| Firefox | 70 |
| Safari | 13 |
| Edge | 79 |
| Node.js | 12.5.0 |
均已支持,无需 polyfill。
构建工具支持
数字分隔符是纯语法糖,构建时直接移除下划线:30_000 → 30000。
| 工具 | 支持情况 |
|---|---|
Babel (@babel/preset-env) | 已内置 @babel/plugin-transform-numeric-separator,无需额外配置 |
| TypeScript | 原生支持,tsc 编译时自动移除 |
| ESBuild | 原生支持 |
| SWC | 原生支持 |
主流构建工具都已支持,转换零成本、零风险。
日常开发建议
推荐使用的场景
| 场景 | 不用分隔符 | 用分隔符 | 收益 |
|---|---|---|---|
| 毫秒常量 | setTimeout(fn, 30000) | setTimeout(fn, 30_000) | 一眼看出是 30 秒 |
| 金额 | const price = 1500000 | const price = 1_500_000 | 快速判断量级 |
| 位掩码 | 0b00100100 | 0b0010_0100 | 按字节分组更清晰 |
| 颜色值 | 0xFF8800 | 0xFF_88_00 | RGB 分组 |
| 文件大小 | maxSize = 10485760 | maxSize = 10_485_760 | 10MB 一目了然 |
不需要使用的场景
- 小数字(如
100、1000)不需要分隔符,加了反而显得冗余 - 动态值 —— 分隔符只能用在源代码字面量中,运行时从 API 或用户输入拿到的数字无法使用
ESLint 规则
如果团队希望统一风格,可以启用 ESLint 的 @stylistic/number-separator 规则,强制对超过一定位数的数字使用分隔符。
实际应用场景
// 金额更清晰
const budget = 1_500_000;
// 权限位掩码一目了然
const permissions = 0b0010_0100;
// 颜色值分组
const color = 0xFF_88_00;
// 毫秒常量
const TIMEOUT = 30_000; // 30 秒
const ONE_DAY = 86_400_000; // 24 小时