Investigamos por el mundo on line para así traerte la respuesta a tu dilema, si continúas con alguna difcultad puedes dejar tu comentario y te respondemos con mucho gusto, porque estamos para servirte.
Precedencia del operador determina cómo se analizan los operadores entre sí. Los operadores con mayor precedencia se convierten en operandos de los operadores con menor precedencia.
Precedencia y asociatividad
Considere una expresión que se pueda describir mediante la siguiente representación. Tenga en cuenta que tanto OP1 y OP2 son espacios en blanco para los operadores operativos.
a OP1 b OP2 c
Si OP1
y OP2
tienen diferentes niveles de precedencia (consulte la tabla siguiente), el operador con mayor precedencia va primero y la asociatividad no importa. Observe cómo la multiplicación tiene mayor precedencia que la suma y se ejecuta primero, aunque la suma se escribe primero en el código.
console.log(3+10*2);// logs 23 console.log(3+(10*2));// logs 23 because parentheses here are superfluous console.log((3+10)*2);// logs 26 because the parentheses change the order
Asociatividad izquierda (de izquierda a derecha) significa que se procesa como (a OP1 b) OP2 c
, mientras que la asociatividad derecha (de derecha a izquierda) significa que se interpreta como a OP1 (b OP2 c)
. Los operadores de asignación son asociativos a la derecha, por lo que puede escribir:
a = b =5;// same as writing a = (b = 5);
con el resultado esperado que a
y b
obtenga el valor 5. Esto se debe a que el operador de asignación devuelve el valor asignado. Primero, b
se establece en 5. Entonces el a
también se establece en 5, el valor de retorno de b = 5
, también conocido como operando derecho de la asignación.
Como otro ejemplo, el operador de exponenciación único tiene asociatividad por la derecha, mientras que otros operadores aritméticos tienen asociatividad por la izquierda. Es interesante notar que el orden de evaluación es siempre de izquierda a derecha independientemente de la asociatividad y la precedencia.
Código | Producción |
functionecho(name, num) console.log("Evaluating the "+ name +" side");return num;// Notice the division operator (/) console.log(echo("left",6)/echo("right",2)); |
Evaluating the left side Evaluating the right side 3 |
functionecho(name, num) console.log("Evaluating the "+ name +" side");return num;// Notice the exponentiation operator (**) console.log(echo("left",2)**echo("right",3)); |
Evaluating the left side Evaluating the right side 8 |
La diferencia de asociatividad entra en juego cuando hay varios operadores de la misma precedencia. Con solo un operador u operadores de diferentes precedencias, la asociatividad no afecta la salida, como se ve en el ejemplo anterior. En el siguiente ejemplo, observe cómo la asociatividad afecta la salida cuando se utilizan varios del mismo operador.
Código | Producción |
functionecho(name, num) console.log("Evaluating the "+ name +" side");return num;// Notice the division operator (/) console.log(echo("left",6)/echo("middle",2)/echo("right",3)); |
Evaluating the left side Evaluating the middle side Evaluating the right side 1 |
functionecho(name, num) console.log("Evaluating the "+ name +" side");return num;// Notice the exponentiation operator (**) console.log(echo("left",2)**echo("middle",3)**echo("right",2)); |
Evaluating the left side Evaluating the middle side Evaluating the right side 512 |
functionecho(name, num) console.log("Evaluating the "+ name +" side");return num;// Notice the parentheses around the left and middle exponentiation console.log((echo("left",2)**echo("middle",3))**echo("right",2)); |
Evaluating the left side Evaluating the middle side Evaluating the right side 64 |
Mirando los fragmentos de código anteriores, 6 / 3 / 2
es lo mismo que (6 / 3) / 2
porque la división es asociativa por la izquierda. La exponenciación, por otro lado, es asociativa a la derecha, por lo que 2 ** 3 ** 2
es lo mismo que 2 ** (3 ** 2)
. Por lo tanto, haciendo (2 ** 3) ** 2
cambia el orden y da como resultado los 64 que se ven en la tabla anterior.
Recuerde que la precedencia precede a la asociatividad. Entonces, mezclando división y exponenciación, la exponenciación viene antes de la división. Por ejemplo, 2 ** 3 / 3 ** 2
da como resultado 0.8888888888888888 porque es lo mismo que (2 ** 3) / (3 ** 2)
.
Nota sobre agrupación y cortocircuito
En la siguiente tabla, Agrupamiento aparece como el que tiene la prioridad más alta. Sin embargo, eso no siempre significa la expresión dentro de los símbolos de agrupación ( … )
se evalúa primero, especialmente cuando se trata de cortocircuitos.
El cortocircuito es una jerga para la evaluación condicional. Por ejemplo, en la expresión a && (b + c)
, si a
es falsedad, luego la subexpresión (b + c)
ni siquiera será evaluado, incluso si está entre paréntesis. Podríamos decir que el operador de disyunción lógica (“O”) está “cortocircuitado”. Junto con la disyunción lógica, otros operadores en cortocircuito incluyen la conjunción lógica (“Y”), la unión nula, el encadenamiento opcional y el operador condicional. A continuación se muestran algunos ejemplos más.
a ||(b * c);// evaluate `a` first, then produce `a` if `a` is "truthy" a &&(b < c);// evaluate `a` first, then produce `a` if `a` is "falsy" a ??(b || c);// evaluate `a` first, then produce `a` if `a` is not `null` and not `undefined` a?.b.c;// evaluate `a` first, then produce `undefined` if `a` is `null` or `undefined`
Ejemplos de
3>2&&2>1// returns true3>2>1// Returns false because 3 > 2 is true, then true is converted to 1// in inequality operators, therefore true > 1 becomes 1 > 1, which// is false. Adding parentheses makes things clear: (3 > 2) > 1.
Mesa
La siguiente tabla enumera los operadores en orden de mayor precedencia (21) a menor precedencia (1).
Tenga en cuenta que la sintaxis de propagación no se incluye intencionalmente en la tabla, porque, para citar un una respuesta en Stack Overflow, “La sintaxis de propagación no es un operador y por tanto no tiene precedencia. Es parte del array sintaxis literal y de llamada a función (y literal de objeto) “.
Precedencia | Tipo de operador | Asociatividad | Operadores individuales |
---|---|---|---|
21 | Agrupamiento | n / A | ( … ) |
20 | Acceso para miembros | de izquierda a derecha | … . … |
Acceso de miembros calculado | de izquierda a derecha | … [ … ] |
|
new (con lista de argumentos) |
n / A | new … ( … ) |
|
Llamada de función | de izquierda a derecha | … ( … ) |
|
Encadenamiento opcional | de izquierda a derecha | ?. |
|
19 | new (sin lista de argumentos) |
De derecha a izquierda | new … |
18 | Incremento de sufijo | n / A | … ++ |
Decremento de sufijo | … -- |
||
17 | NO lógico (!) | De derecha a izquierda | ! … |
Bit a bit NOT (~) | ~ … |
||
Unario más (+) | + … |
||
Negación unaria (-) | - … |
||
Incremento de prefijo | ++ … |
||
Decremento de prefijo | -- … |
||
typeof |
typeof … |
||
void |
void … |
||
delete |
delete … |
||
await |
await … |
||
dieciséis | Exponenciación (**) | De derecha a izquierda | … ** … |
15 | Multiplicación | … * … |
|
de izquierda a derecha | … / … |
||
División (/) | … % … |
||
Recordatorio (%) | 14 | Suma (+) | … + … |
de izquierda a derecha | … - … |
||
Resta (-) | 13 | Desplazamiento a la izquierda bit a bit (<<) | … << … |
de izquierda a derecha | … >> … |
||
Desplazamiento a la derecha bit a bit (>>) | … >>> … |
||
Desplazamiento a la derecha sin signo bit a bit (>>>) | 12 | Menor que (<) | … < … |
de izquierda a derecha | … <= … |
||
Menor o igual (<=) | … > … |
||
Mayor que (>) | … >= … |
||
in |
… in … |
||
instanceof |
… instanceof … |
||
Mayor o igual (> =) | 11 | Igualdad (==) | … == … |
de izquierda a derecha | … != … |
||
Desigualdad (! =) | … === … |
||
Igualdad estricta (===) | … !== … |
||
Desigualdad estricta (! ==) | 10 | Y (&) bit a bit | … & … |
de izquierda a derecha | 9 | XOR bit a bit (^) | … ^ … |
de izquierda a derecha | 8 | O bit a bit (|) | … | … |
de izquierda a derecha | 7 | AND lógico (&&) | … && … |
de izquierda a derecha | 6 | OR lógico (||) | … || … |
de izquierda a derecha | 5 | Operador coalescente nulo (??) | … ?? … |
de izquierda a derecha | 4 | Operador condicional (ternario) | … ? … : … |
De derecha a izquierda | 3 | Asignación | … = … |
… += … |
|||
… -= … |
|||
… **= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
… &&= … |
|||
… ||= … |
|||
… ??= … |
|||
De derecha a izquierda | yield |
2 | yield … |
yield* |
yield* … |
||
De derecha a izquierda | 1 | Coma / Secuencia | … , … |
de izquierda a derecha
Comentarios y puntuaciones del tutorial
Si te animas, tienes la opción de dejar un tutorial acerca de qué le añadirías a este enunciado.