wake-up-neo.com

Warum ist -1 ** 2 ein Syntaxfehler in JavaScript?

Wird es in der Browserkonsole ausgeführt, heißt es SyntaxError: Unexpected token **. Versuchen Sie es in Knoten:

> -1**2
...
...
...
...^C

Ich dachte, das ist ein arithmetischer Ausdruck, in dem ** ist der Netzbetreiber. Es gibt kein solches Problem mit anderen Betreibern.

Seltsamerweise tippt */ in der zweiten Zeile löst die Ausführung aus:

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **

Was passiert hier?

56
psmith

Bei der Ausführung in der Browserkonsole wird SyntaxError: Unerwartetes Token ** angezeigt.

Denn das ist das spec . Auf diese Weise entworfen, um Verwirrung darüber zu vermeiden, ob es sich um das Quadrat der Negation von Eins (d. H. (-1) ** 2) Oder die Negation des Quadrats von Eins (d. H. -(1 ** 2) handelt. Dieses Design war das Ergebnis von ausführliche Diskussion der Operatorpräzision und der Prüfung, wie dies in anderen Sprachen gehandhabt wird, und schließlich wurde die Entscheidung getroffen, unerwartetes Verhalten zu vermeiden, indem dies zu einem Syntaxfehler gemacht wurde.

79
user663031

Aus der Dokumentation auf MDN :

In JavaScript ist es unmöglich, einen mehrdeutigen Exponentiationsausdruck zu schreiben, d. H. Sie können keinen unären Operator (+/-/~/!/delete/void/typeof) unmittelbar vor der Basisnummer.

Im selben Text wird auch der Grund erläutert:

In den meisten Sprachen wie PHP und Python und anderen, die einen Potenzierungsoperator haben (normalerweise ^ oder **) hat der Exponentiationsoperator eine höhere Priorität als unäre Operatoren wie unäre + und unary -, aber es gibt einige Ausnahmen. Zum Beispiel in Bash die ** Operator hat eine niedrigere Priorität als unäre Operatoren.

Um Verwirrung zu vermeiden, wurde entschieden, dass der Code die Mehrdeutigkeit beseitigen und die Klammern explizit setzen muss:

(-1)**2

oder:

-(1**2) 

Als Randnotiz die binäre - wird nicht so behandelt - mit niedrigerer Priorität - und daher hat der letzte Ausdruck das gleiche Ergebnis wie dieser gültige Ausdruck:

0-1**2

Vorrang der Exponentiation in anderen Programmiersprachen

Wie bereits im obigen Zitat bestätigt, haben die meisten Programmiersprachen, die einen Infix-Exponentiationsoperator haben, eine höhere Priorität für diesen Operator als für das unäre Minus.

Hier sind einige andere Beispiele für Programmiersprachen, die dem unären Minus-Operator eine höhere Priorität einräumen:

40
trincot