試一試
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 |
瀏覽器相容性
載入中…