このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
べき乗演算子 (**)
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);// 予想される結果: 81console.log(10 ** -2);// 予想される結果: 0.01console.log(2 ** (3 ** 2));// 予想される結果: 512console.log((2 ** 3) ** 2);// 予想される結果: 64構文
x ** y解説
** 演算子は、数値と長整数の 2 種類のオペランドに対してオーバーロードされています。まず両オペランドを数値型に変換し、それらの型を検査します。両オペランドが長整数になった場合、長整数のべき乗を実行します。そうでない場合は数値除算を実行します。一方のオペランドが長整数になり、もう一方が数値になった場合は、TypeError が発生します。
数値と長整数の両方において、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 を返します。
長整数のべき乗では、指数y が負の場合はRangeError が発生します。これらは、負の指数は(底が1、-1、または0 である場合を除き) 0 から 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; // 83 ** 2; // 93 ** 2.5; // 15.58845726811989610 ** -1; // 0.12 ** 1024; // InfinityNaN ** 2; // NaNNaN ** 0; // 11 ** Infinity; // NaNその他の長整数以外の値は、数値に変換されます。
2 ** "3"; // 82 ** "hello"; // NaN長整数を使用したべき乗
2n ** 3n; // 8n2n ** 1024n; // 巨大な数値であるが、 Infinity ではないべき乗計算では、長整数とと数値のオペランドを混在させることはできません。
2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversionsべき乗を長整数と長整数以外の組み合わせで実行するには、どちらかのオペランドを変換してください。
2n ** BigInt(2); // 4nNumber(2n) ** 2; // 4結合性
2 ** 3 ** 2; // 5122 ** (3 ** 2); // 512(2 ** 3) ** 2; // 64単項演算子との使用
べき乗式の結果の符号を反転させる例です。
-(2 ** 2); // -4べき乗式の基底を強制的に負の数にする例です。
(-2) ** 2; // 4