2012-06-22 25 views
26

Por lo tanto, estoy buscando escribir una operación un poco más compleja con operadores lógicos en una instrucción if-else. Sé que puedo hacer paréntesis, y sé que es la mejor manera de hacerlo, pero tengo curiosidad, así que voy a preguntar. Si tuviera que hacer algo como esto:Qué operador lógico toma precedencia

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) { 
//Do something 
} else { 
//Do something else 
} 

¿Cómo se manejará eso sin el uso de paréntesis? Sé que hay un orden de operaciones para operadores lógicos, similar a PEMDAS, ¿verdad? Estoy ansioso por ver si va a ser corrió algo como esto:

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

o tal vez si el operador de la 'O' tiene prioridad en vez y termina yendo como:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined 

La lista completa sería sé agradable, si puedes encontrarlo en alguna parte, del orden de las operaciones para esto. ¡Gracias!

Respuesta

44

Mi regla de oro, que cubre básicamente el 99% de todos los casos de uso de instrucciones condicionales, es:

  1. Agrupación: ()
  2. Acceso Miembro . or [...]
  3. No
  4. : !
  5. Comparación, p.ej < , >= , === , !=, ...
  6. Y lógico &&
  7. OR lógico ||

MDN le da el desglose exhaustivo: Javascript Operator Precedence

así por su ejemplo:

(firstRun == true || selectedCategory != undefined && selectedState != undefined) 

es igual a

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined)) 

¡Para cualquier cosa más compleja que los casos mencionados anteriormente, me gustaría refacturar el código para las cosas buenas de todos modos!

+0

Exactamente lo que se necesitaba; gracias – JTApps

+0

¿Qué hay de 'nuevo'? Tiene la misma precedencia que el acceso de miembros y las llamadas a funciones, así que supongo que eso significa de izquierda a derecha. 'new Foo(). bar()' es equivalente a '(new Foo()). bar()'? Y 'nuevo Foo() (3)' es equivalente a '(nuevo Foo()) (3)'? – chharvey

1

Será la primera:

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

Como regla general, en la mayoría de los lenguajes de programación y tiene una precedencia más alta

7

Ver this chart for precedence.

No voy a explicar lo que sucede porque el siguiente tipo que lea tu código pensará: "¿WTF? ¿Hace eso lo que debería?"

Así que la mejor solución es envolver los términos entre paréntesis incluso si conoce la precedencia, aplicado correctamente y el código funciona

Esto sigue a la vieja sabiduría que no se debe hacer todo lo puede sólo porque puede hacerlo. siempre mantenga un ojo en las consecuencias.

+0

+1 para aconsejar el uso de paréntesis. – geekchic

+0

Sí, entiendo lo que estás diciendo y estoy consciente, el punto de preguntar por mí fue más por conocimiento personal que por nada. ¡Gracias – JTApps

1

Mientras Precedencia operador lógico no está definido en realidad en el ECMAScript Specification, MDN hace un muy buen trabajo de ella e incluso tiene una página separada para Logical Operators.

Mi preocupación Supongo que, dado que la precedencia del operador lógico no está realmente definida en la especificación de ECMAScript, cada proveedor de navegador individual puede ser potencialmente diferente (¡estoy hablando con usted, Internet Explorer!) Para YMMV.

En el caso de que alguien quiere poner a prueba esta a través de diferentes navegadores, aquí está un violín caso de prueba: http://jsfiddle.net/HdzXq/

6

No es una buena regla de oro para esto. Piense de estos operadores como de los matemáticos:

  • AND es la multiplicación (. Ej 0 * 1 = 0 => FALSE)
  • OR es la adición de

Al recordar esto, todo lo que tiene que saber (por ejemplo 0 + 1 = 1 => TRUE). es que la multiplicación siempre viene antes de Además.

+1

esto es realmente un mnemónico muy bueno, tanto en términos de precendencia como de los valores de los bits resultantes! – Christoph

Cuestiones relacionadas