このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

べき乗演算子 (**)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2017年3月⁩.

べき乗演算子 (**) は、1 つ目のオペランドを 2 つ目のオペランドで累乗した結果を返します。これは Math.pow() と同等ですが、オペランドとして長整数も受け入れます。

試してみましょう

console.log(3 ** 4);
// 予想される結果: 81

console.log(10 ** -2);
// 予想される結果: 0.01

console.log(2 ** (3 ** 2));
// 予想される結果: 512

console.log((2 ** 3) ** 2);
// 予想される結果: 64

構文

js
x ** y

解説

** 演算子は、数値と長整数の 2 種類のオペランドに対してオーバーロードされています。まず両オペランドを数値型に変換し、それらの型を検査します。両オペランドが長整数になった場合、長整数のべき乗を実行します。そうでない場合は数値除算を実行します。一方のオペランドが長整数になり、もう一方が数値になった場合は、TypeError が発生します。

数値と長整数の両方において、 0 の正の累乗は 0 を返し、 00 乗は 1 を返します。数値の場合、 0 の負の累乗は Infinity を返し、 -0 の負の累乗は -Infinity を返します。

NaN ** 0(および同等の Math.pow(NaN, 0))は、数学操作において NaN が伝播しない唯一のケースです。オペランドが NaN であるにもかかわらず、結果は 1 を返します。さらに、 base が 1 で exponent が非有限数(±Infinity または NaN)の場合の挙動は IEEE 754 規格と異なります。規格では結果が 1 であるべきと指定しているのに対し、 JavaScript は後方互換性を維持するため NaN を返します。

長整数のべき乗では、指数 y が負の場合は RangeError が発生します。これらは、負の指数は(底が 1-1、または 0 である場合を除き) 0 から 1 の間の値となる可能性が高く、丸め処理で 0 に変換されるため、開発者のミスである可能性が高いからです。

べき乗演算子は右結合です。 a ** b ** ca ** (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

その他の長整数以外の値は、数値に変換されます。

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

長整数を使用したべき乗

js
2n ** 3n; // 8n
2n ** 1024n; // 巨大な数値であるが、 Infinity ではない

べき乗計算では、長整数とと数値のオペランドを混在させることはできません。

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

べき乗を長整数と長整数以外の組み合わせで実行するには、どちらかのオペランドを変換してください。

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

仕様書

If you're able to see this, something went wrong on this page.

ブラウザーの互換性

If you're able to see this, something went wrong on this page.

関連情報