べき乗演算子 (**)
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
構文
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; // 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
その他の長整数以外の値は、数値に変換されます。
2 ** "3"; // 8
2 ** "hello"; // NaN
長整数を使用したべき乗
2n ** 3n; // 8n
2n ** 1024n; // 巨大な数値であるが、 Infinity ではない
べき乗計算では、長整数とと数値のオペランドを混在させることはできません。
2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
べき乗を長整数と長整数以外の組み合わせで実行するには、どちらかのオペランドを変換してください。
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