2012-01-21 7 views
5

Pregunta: ¿El orden de los operandos hace alguna diferencia al evaluar la igualdad o la identidad en JavaScript?¿El orden de los operandos hace alguna diferencia cuando se evalúa la igualdad o la identidad en JavaScript?

¿En el código, es (0 == value) más rápido o más correcto que (value == 0)? (Tenga en cuenta que esta pregunta es igualmente válida para el operador de identidad, ===.)

Como los operadores de igualdad e identidad son conmutativos, no creo que el orden de los operandos deba hacer una diferencia en el rendimiento de la evaluación, a menos que exista alguna beneficio del literal del lado izquierdo en el cálculo del algoritmo de igualdad en sí. La única razón por la que pregunto es que recientemente he usado Closure Compiler de Google a reducirse algo de JavaScript, y se dio cuenta de que

if (array.length == 0 && typeof length === 'number') {

habían sido compilado a

if(0 == b.length && "number" === typeof c) {.

En ambas expresiones de igualdad, una suelta y otra estricta, Closure ha invertido el orden de mis operandos, colocando un literal numérico y un literal de cadena en los lados izquierdos de sus respectivas expresiones.

Esto me hizo sentir curiosidad.

He leído a través de la sección Igualdad Operadores del ECMAScript 5.1 Language Specification (sección 11.9, pp. 80-82) y se encontró que mientras que los algoritmos de igualdad comienzan examinando los operandos de la mano izquierda en primer lugar, no hay ninguna indicación de que es más rápido o mejor usar un literal como ese operando.

¿Hay algo sobre la comprobación de tipos de ECMAScript que hace que el examen de literales sea óptimo? ¿Podría ser alguna peculiaridad de optimización en el compilador Closure? ¿O quizás un detalle de implementación en una versión anterior del algoritmo de igualdad de ECMAScript que ha sido anulado en esta nueva versión de la especificación?

+1

creo que este "error" se presenta como un efecto secundario del modo en que Google analizadores y reconstruye el código y no tiene nada que ver con los efectos secundarios o su exactitud ni de orden de operando – Raynos

+0

Para verificar la velocidad, simplemente ejecute pruebas en [JS Perf] (http://jsperf.com). Esto, por supuesto, solo medirá los navegadores que tenga disponibles ejecutando los casos de prueba que cree, en lugar de ofrecer una evaluación teórica/'objetiva'. –

Respuesta

1

http://jsperf.com/lr-equality

realmente no puedo darle una explicación, pero se puede comprobar los números. Parecen ser iguales (ahora).

+0

hola, tengo una teoría interesante sobre los operadores 'mayor/menor que'. Podría ser interesante si pudieras agregar esos también. por ejemplo 'a < 5 and 5 > a' – ajax333221

+0

Los números son incomparables, así que solo mire los datos sin procesar: http: // jsperf.com/lr-equality – Blender

+0

Gracias por echarle un vistazo. También realicé pruebas de rendimiento, pero me pregunté si existe una razón algorítmica para la diferencia porque eso podría indicar una tendencia más grande en el rendimiento de JavaScript. Esencialmente, estoy tratando de determinar si hay una razón de origen para la diferencia de rendimiento y si puedo obtener otros beneficios de rendimiento cambiando un hábito. ¡Pero aprecio la entrada! – piersadrian

2

Mucha gente codifica con la variable de la derecha como una convención de estilo. La razón principal es que puede detectar errores con codificación descuidada.

El siguiente código probablemente sea un error, pero la sentencia if se evaluará como verdadera.

if(n = 1) { } 

y esto generará un error

if(1 = n) { } 
+2

@PiersMainwaring No dijo que se evalúa como verdadero * porque * de un error - dijo que cuando está escrito usualmente * es * un error, y se pretendía una comparación (en lugar de una asignación). Está respondiendo tu pregunta: no es una cuestión de rendimiento, es una forma de reducir una clase de errores. –

+0

@DaveNewton Ah, entendido. Estaba centrado en el tema de la igualdad y leí mal la respuesta. Mis disculpas. – piersadrian

+0

Entonces, ¿está implicando que Closure Compiler podría ser también una especie de herramienta de control de calidad? – katspaugh

Cuestiones relacionadas