Potenzierung (**)
Der **Potenzierungsoperator (**
)** gibt das Ergebnis der Erhebung des ersten Operanden zur Potenz des zweiten Operanden zurück. Er ist gleichwertig zu Math.pow()
, außer dass er auch BigInts als Operanden akzeptiert.
Probieren Sie es aus
Syntax
x ** y
Beschreibung
Der **
Operator ist für zwei Typen von Operanden überladen: Zahlen und BigInt. Er verwandelt beide Operanden zuerst in numerische Werte und prüft deren Typen. Er führt eine BigInt-Potenzierung durch, wenn beide Operanden zu BigInts werden; andernfalls wird eine Zahlenpotenzierung durchgeführt. Ein TypeError
wird ausgelöst, wenn ein Operand zu einem BigInt und der andere zu einer Zahl wird.
Für sowohl Zahlen als auch BigInts ergibt 0
hoch zu einer positiven Potenz 0
, und 0
hoch zu einer Potenz von 0
ergibt 1
. Für Zahlen ergibt 0
hoch zu einer negativen Zahl Infinity
, während -0
hoch zu einer negativen Zahl -Infinity
ergibt.
NaN ** 0
(und das Äquivalent Math.pow(NaN, 0)
) ist der einzige Fall, bei dem NaN
nicht durch mathematische Operationen propagiert wird – es gibt 1
zurück, obwohl der Operand NaN
ist. Zudem ist das Verhalten, wenn die Basis 1 und der Exponent nicht endlich (±Infinity oder NaN
) ist, anders als in IEEE 754, das spezifiziert, dass das Ergebnis 1 sein sollte, während JavaScript NaN
zurückgibt, um die Rückwärtskompatibilität mit seinem ursprünglichen Verhalten zu bewahren.
Für die BigInt-Potenzierung wird ein RangeError
ausgelöst, wenn der Exponent y
negativ ist. Dies liegt daran, dass ein negativer Exponent wahrscheinlich zu einem Wert zwischen 0 und 1 führen würde (außer die Basis ist 1
, -1
oder 0
), der auf null gerundet wird und wahrscheinlich ein Entwicklerfehler ist.
Der Potenzierungsoperator ist rechtsassoziativ: a ** b ** c
ist gleich a ** (b ** c)
.
In den meisten Sprachen, wie PHP, Python und anderen, die einen Potenzierungsoperator (**
) besitzen, hat der Potenzierungsoperator eine höhere Priorität als unäre Operatoren, wie unäres +
und unäres -
, aber es gibt einige Ausnahmen. Zum Beispiel hat in Bash der **
Operator eine niedrigere Priorität als unäre Operatoren.
In JavaScript ist es unmöglich, einen mehrdeutigen Potenzierungsausdruck zu schreiben. Das heißt, Sie können keinen unären Operator (mit Priorität 14, einschließlich +
/-
/~
/!
/++
/--
/delete
/void
/typeof
/await
) unmittelbar vor der Basiszahl setzen; dies führt zu einem SyntaxError.
Zum Beispiel ist -2 ** 2
in Bash 4, aber in anderen Sprachen (wie Python) -4. Dies ist ungültig in JavaScript, da die Operation mehrdeutig ist. Sie müssen entweder die eine oder die andere Seite in Klammern setzen – zum Beispiel als -(2 ** 2)
– um die Absicht unmissverständlich zu machen.
Beachten Sie, dass einige Programmiersprachen das Caret-Symbol ^
für die Potenzierung verwenden, aber JavaScript benutzt dieses Symbol für den bitweisen XOR-Operator.
Beispiele
Potenzierung mit Zahlen
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
Andere Nicht-BigInt-Werte werden zu Zahlen umgewandelt:
2 ** "3"; // 8
2 ** "hello"; // NaN
Potenzierung mit BigInts
2n ** 3n; // 8n
2n ** 1024n; // A very large number, but not Infinity
Sie können BigInt und Zahlenoperanden nicht in der Potenzierung mischen.
2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
Um eine Potenzierung mit einem BigInt und einem Nicht-BigInt durchzuführen, konvertieren Sie einen der beiden Operanden:
2n ** BigInt(2); // 4n
Number(2n) ** 2; // 4
Assoziativität
2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512
(2 ** 3) ** 2; // 64
Verwendung mit unären Operatoren
Um das Vorzeichen des Ergebnisses eines Potenzierungsausdrucks zu invertieren:
-(2 ** 2); // -4
Um die Basis eines Potenzierungsausdrucks zu einer negativen Zahl zu machen:
(-2) ** 2; // 4
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-exp-operator |
Browser-Kompatibilität
BCD tables only load in the browser