幂 (**)

Baseline 已广泛支持

此特性已得到良好确立,可跨多种设备和浏览器版本使用。自 2017 年 3 月起,所有浏览器均支持此特性。

求幂运算符(**返回第一个操作数提升到第二个操作数幂次的结果。它等同于 Math.pow(),但它也接受 BigInt 作为操作数。

试一试

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

语法

js
x ** y

描述

** 运算符对两种类型的操作数进行重载:数字和 BigInt。它首先 将两个操作数强制转换为数字值 并测试它们的类型。如果两个操作数都变为 BigInt,则执行 BigInt 求幂;否则,执行数字求幂。如果一个操作数变为 BigInt 而另一个变为数字,则抛出 TypeError

对于数字和 BigInt,0 的正幂次返回 000 次幂返回 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-10),该值会四舍五入为零,并且很可能是开发人员的错误。

求幂运算符是右结合的: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 将该符号用于按位异或运算符

示例

使用数字进行求幂

js
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 值被强制转换为数字

js
2 ** "3"; // 8
2 ** "hello"; // NaN

使用 BigInt 进行求幂

js
2n ** 3n; // 8n
2n ** 1024n; // A very large number, but not Infinity

你不能在求幂中混合使用 BigInt 和数字操作数。

js
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 进行求幂,请转换其中一个操作数

js
2n ** BigInt(2); // 4n
Number(2n) ** 2; // 4

结合性

js
2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512
(2 ** 3) ** 2; // 64

与一元运算符一起使用

反转求幂表达式结果的符号

js
-(2 ** 2); // -4

强制求幂表达式的底数为负数

js
(-2) ** 2; // 4

规范

规范
ECMAScript® 2026 语言规范
# sec-exp-operator

浏览器兼容性

另见