试一试
console.log(3 ** 4);
// Expected output: 81
console.log(10 ** -2);
// Expected output: 0.01
console.log(2 ** (3 ** 2));
// Expected output: 512
console.log((2 ** 3) ** 2);
// Expected output: 64
语法
x ** y
描述
** 运算符对两种类型的操作数进行重载:数字和 BigInt。它首先 将两个操作数强制转换为数字值 并测试它们的类型。如果两个操作数都变为 BigInt,则执行 BigInt 求幂;否则,执行数字求幂。如果一个操作数变为 BigInt 而另一个变为数字,则抛出 TypeError。
对于数字和 BigInt,0 的正幂次返回 0,0 的 0 次幂返回 1。对于数字,0 的负幂次返回 Infinity,而 -0 的负幂次返回 -Infinity。
NaN ** 0(以及等效的 Math.pow(NaN, 0))是 NaN 不会通过数学运算传播的唯一情况——尽管操作数为 NaN,但它返回 1。此外,当 base 为 1 且 exponent 为非有限值(±Infinity 或 NaN)时的行为与 IEEE 754 不同,后者规定结果应为 1,而 JavaScript 返回 NaN 以保留与原始行为的向后兼容性。
对于 BigInt 求幂,如果指数 y 为负数,则抛出 RangeError。这是因为任何负指数都可能导致 0 到 1 之间的值(除非底数为 1、-1 或 0),该值会四舍五入为零,并且很可能是开发人员的错误。
求幂运算符是右结合的:a ** b ** c 等同于 a ** (b ** c)。
在大多数语言中,例如 PHP、Python 和其他具有求幂运算符 (**) 的语言中,求幂运算符被定义为具有比一元运算符(例如一元 + 和一元 -)更高的优先级,但也有少数例外。例如,在 Bash 中,** 运算符被定义为具有比一元运算符更低的优先级。
在 JavaScript 中,不可能编写模糊不清的求幂表达式。也就是说,你不能将一元运算符(优先级为 14,包括 +/-/~/!/++/--/delete/void/typeof/await)直接放在底数之前;这样做会导致 SyntaxError。
例如,-2 ** 2 在 Bash 中是 4,但在其他语言(如 Python)中是 -4。这在 JavaScript 中是无效的,因为该操作是模糊不清的。你必须将其中一边用括号括起来——例如,-(2 ** 2)——以明确意图。
请注意,某些编程语言使用脱字号符号 ^ 进行求幂运算,但 JavaScript 将该符号用于按位异或运算符。
示例
使用数字进行求幂
2 ** 3; // 8
3 ** 2; // 9
3 ** 2.5; // 15.588457268119896
10 ** -1; // 0.1
2 ** 1024; // Infinity
NaN ** 2; // NaN
NaN ** 0; // 1
1 ** Infinity; // NaN
其他非 BigInt 值被强制转换为数字
2 ** "3"; // 8
2 ** "hello"; // NaN
使用 BigInt 进行求幂
2n ** 3n; // 8n
2n ** 1024n; // A very large number, but not Infinity
你不能在求幂中混合使用 BigInt 和数字操作数。
2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
要对 BigInt 和非 BigInt 进行求幂,请转换其中一个操作数
2n ** BigInt(2); // 4n
Number(2n) ** 2; // 4
结合性
2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512
(2 ** 3) ** 2; // 64
与一元运算符一起使用
反转求幂表达式结果的符号
-(2 ** 2); // -4
强制求幂表达式的底数为负数
(-2) ** 2; // 4
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-exp-operator |
浏览器兼容性
加载中…