指数运算 (**)
指数运算符 (**
) 返回第一个操作数的第二个操作数次方结果。它等同于 Math.pow()
,不同之处在于它还接受 BigInts 作为操作数。
试试看
语法
x ** y
描述
**
运算符对两种类型的操作数进行重载:数字和 BigInt。它首先 将两个操作数强制转换为数值 并测试它们的类型。如果两个操作数都成为 BigInts,则执行 BigInt 指数运算;否则,执行数字指数运算。如果一个操作数成为 BigInt,而另一个操作数成为数字,则会抛出 TypeError
。
对于数字和 BigInts,0
乘以正数幂返回 0
,0
乘以 0
幂返回 1
。对于数字,0
乘以负数返回 Infinity
,而 -0
乘以负数返回 -Infinity
。
NaN ** 0
(以及等效的 Math.pow(NaN, 0)
)是 NaN
不通过数学运算传播的唯一情况——它返回 1
,尽管操作数是 NaN
。此外,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
使用 BigInts 进行指数运算
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 语言规范 # sec-exp-operator |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。