Tengo este código:
let x = -2; let ex = ((x += 10) > ++x) * 2; console.log(ex);¿Intentando averiguar por qué la salida en la consola aquí es 0, mientras que creo que debería ser 2? Aquí está mi razonamiento detrás de esto:
Cuando hago referencia al orden de precedencia en MDN, también debo tener en cuenta los corchetes dobles aquí. Esto significa que así es como prioricé mis acciones:
+= (entre corchetes dobles) // obtengo un valor 8++ (según la segunda prioridad más alta en un paréntesis global) // Obtengo -1> (la tercera prioridad) // en este punto estoy comparando 8 contra -1 (8 > -1) = verdadero, lo que significa que el valor ahora se convierte en 1* (último) // 1 * 2 = 2 Arriba está mi propio proceso de pensamiento. ¿Puede explicar por qué debería obtener 0 al final? Intuitivamente, significa que el valor booleano entre paréntesis debe ser false para convertirse en 0 . Y luego 0 * 2 = 0 .
Gracias.
Tiene sentido si lo miras una expresión a la vez:
let x = -2; // x = -2 let ex = ( ( x+= 10) // x = 8 (which is what this expression returns) > ++x // x = 9 (which is what this expression returns) ) * 2: // In other words: let ex = (8 > 9) * 2; // which results in 0 La precedencia del operador es importante, sí, pero eso no significa que la VM precalculará repentinamente una expresión en el lado derecho de > . Al evaluar expresiones de operadores binarios, siempre evaluará el lado izquierdo, luego el lado derecho. (con la excepción de, por ejemplo, && donde se puede omitir el lado derecho) .