べき乗演算子 (**)
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。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
構文
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 では演算子が曖昧であるため、無効な操作です。意図を明確にするには、いずれかの辺を括弧で囲む必要があります。例えば