tutorial programacion operadores numero ecmascript aritmeticos javascript exponentiation ecmascript-2016

programacion - javascript modulo de un numero



¿Por qué-1** 2 es un error de sintaxis en JavaScript? (2)

Al ejecutarlo en la consola del navegador, dice SyntaxError: Unexpected token ** . Probándolo en el nodo:

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

Pensé que esta es una expresión aritmética donde ** es el operador de potencia. No existe tal problema con otros operadores.

Curiosamente, escribir */ en la segunda línea desencadena la ejecución:

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

¿Que está sucediendo aquí?


Ejecutarlo en la consola del navegador dice SyntaxError: token inesperado **.

Porque esa es la spec . Diseñado de esa manera para evitar confusiones sobre si es el cuadrado de la negación de uno (es decir (-1) ** 2 ), o la negación del cuadrado de uno (es decir, -(1 ** 2) ). Este diseño fue el resultado de una extensa discusión sobre la precedencia del operador y el examen de cómo se maneja esto en otros idiomas, y finalmente se tomó la decisión de evitar un comportamiento inesperado al hacer de esto un error de sintaxis.


De la documentación en MDN :

En JavaScript, es imposible escribir una expresión de exponenciación ambigua, es decir, no puede poner un operador unario ( + / - / ~ / ! / delete / void / typeof ) inmediatamente antes del número base.

La razón también se explica en ese mismo texto:

En la mayoría de los lenguajes como PHP y Python y otros que tienen un operador de exponenciación (típicamente ^ o ** ), el operador de exponenciación se define para tener una precedencia más alta que los operadores unarios como unary + y unary - , pero hay algunas excepciones. Por ejemplo, en Bash, el operador ** se define para tener una precedencia más baja que los operadores unarios.

Entonces, para evitar confusiones, se decidió que el código debe eliminar la ambigüedad y poner explícitamente los paréntesis:

(-1)**2

o:

-(1**2)

Como nota al margen, el binario - no se trata de esa manera, tiene menor prioridad, por lo que la última expresión tiene el mismo resultado que esta expresión válida:

0-1**2

Precedencia de exponenciación en otros lenguajes de programación

Como ya se afirmó en la cita anterior, la mayoría de los lenguajes de programación que tienen un operador de exponenciación infijo, otorgan una mayor prioridad a ese operador que al menos unario.

Estos son algunos otros ejemplos de lenguajes de programación que otorgan mayor prioridad al operador unario menos: