数值分隔符和幂运算符有什么用?使用时有哪些限制?
简化版
数值分隔符 _ 用来提升长数字可读性,比如 1_000_000;幂运算符 ** 用来表示乘方,比如 2 ** 10 等于 1024。
它们主要改善代码表达,不改变数值本质。_ 只能放在数字中间,不能放在开头、结尾、小数点旁边或连续出现;** 和一元运算符组合时要加括号,比如 -(2 ** 2)。
详细版
const amount = 1_000_000;
const mask = 0b1111_0000;
const color = 0xff_00_aa;
console.log(amount); // 1000000
console.log(2 ** 10); // 1024
非法写法:
// 1__000
// 1_
// _100
// 1_.2
幂运算符优先级有特殊限制:
-(2 ** 2); // -4
// -2 ** 2; // SyntaxError
完整版教学
一、数值分隔符解决可读性问题
长数字最怕少看一位或多看一位。
const maxSize = 10485760;
const readableMaxSize = 10_485_760;
两个值完全一样,但后者更容易读。
数值分隔符是给人看的,不是给运行时新增一种数字类型。
二、分隔符不影响数值大小
console.log(1_000 === 1000); // true
console.log(0b1010_0001 === 0b10100001); // true
它可以用于十进制、二进制、八进制、十六进制、BigInt 等数字字面量。
| 写法 | 值 |
|---|---|
1_000_000 | 1000000 |
0b1111_0000 | 240 |
1_000n | 1000n |
三、分隔符的位置限制
_ 只能在两个数字字符之间。
const ok = 123_456;
不能放在这些地方:
// const a = _123;
// const b = 123_;
// const c = 123__456;
// const d = 1_.5;
这些限制让数字字面量保持明确解析。
四、幂运算符替代 Math.pow
Math.pow(2, 10); // 1024
2 ** 10; // 1024
** 让数学表达更接近公式。
const area = Math.PI * radius ** 2;
对于简单幂运算,它比 Math.pow 更直观。
五、幂运算符是右结合
2 ** 3 ** 2; // 512
它等价于:
2 ** (3 ** 2); // 2 ** 9
如果想表达 (2 ** 3) ** 2,必须加括号。
六、和一元运算符组合要加括号
-(2 ** 2); // -4
(-2) ** 2; // 4
不能直接写:
// -2 ** 2
这是语法层面的限制,用括号表达意图最清楚。
七、常见误区与追问
- 误区:数值分隔符会改变数字字符串展示。 它只存在于源码字面量中,运行时值没有下划线。
- 误区:下划线可以随便放。 它只能放在数字之间,不能连续或贴着小数点。
- 误区:
2 ** 3 ** 2从左往右算。 幂运算符是右结合。 - 误区:
-2 ** 2表示负二的平方。 这会产生语法错误,应加括号。 - 追问:为什么
radius ** 2比Math.pow常更直观? 它更接近数学公式,减少函数调用包裹。 - 追问:分隔符适合哪些数字? 金额、字节数、位掩码、颜色值、BigInt 等长字面量。
八、加强记忆
记住两个点:
_ -> readability only
** -> power, right-associative
回答时用 1_000_000 和 2 ** 10 举例,再补位置限制和一元负号括号问题,就能覆盖大多数追问。