web-dev-qa-db-fra.com

Pourquoi -1 ** 2 est-il une erreur de syntaxe en JavaScript?

En l'exécutant dans la console du navigateur, il est indiqué SyntaxError: Unexpected token **. L'essayer dans le noeud:

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

Je pensais que c'était une expression arithmétique où ** est l'opérateur de puissance. Il n'y a pas un tel problème avec d'autres opérateurs.

Étrangement, en tapant */ sur la deuxième ligne déclenche l'exécution:

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

Que se passe-t-il ici?

56
psmith

L'exécuter dans la console du navigateur indique SyntaxError: jeton inattendu **.

Parce que c'est le spec . Conçu de cette façon pour éviter toute confusion quant à savoir si c'est le carré de la négation de un (c'est-à-dire (-1) ** 2), Ou la négation du carré de un (c'est-à-dire -(1 ** 2)). Cette conception était le résultat de discussion approfondie de la priorité de l'opérateur, et de l'examen de la façon dont cela est géré dans d'autres langues, et finalement la décision a été prise d'éviter un comportement inattendu en faisant une erreur de syntaxe.

79
user663031

De la documentation sur MDN :

En JavaScript, il est impossible d'écrire une expression d'exponentiation ambiguë, c'est-à-dire que vous ne pouvez pas mettre un opérateur unaire (+/-/~/!/delete/void/typeof) immédiatement avant le numéro de base.

La raison est également expliquée dans ce même texte:

Dans la plupart des langues comme PHP et Python et d'autres qui ont un opérateur d'exponentiation (généralement ^ ou **), l'opérateur d'exponentiation est défini comme ayant une priorité plus élevée que les opérateurs unaires tels que les unaires + et unaire -, mais il y a quelques exceptions. Par exemple, dans Bash, le ** L'opérateur est défini comme ayant une priorité plus faible que les opérateurs unaires.

Donc, pour éviter toute confusion, il a été décidé que le code devait lever l'ambiguïté et mettre explicitement les parenthèses:

(-1)**2

ou:

-(1**2) 

En remarque, le binaire - n'est pas traité de cette façon - ayant une priorité inférieure - et donc la dernière expression a le même résultat que cette expression valide:

0-1**2

Priorité d'exponentiation dans d'autres langages de programmation

Comme déjà affirmé dans la citation ci-dessus, la plupart des langages de programmation qui ont un opérateur d'exponentiation infixe, donnent une priorité plus élevée à cet opérateur qu'au moins unaire.

Voici quelques autres exemples de langages de programmation qui donnent une priorité plus élevée à l'opérateur unaire moins:

40
trincot