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?
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.
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
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: