2012-02-13 7 views
5

Estaba buscando uno de los archivos js minificados generados por el cierre. He encontrado que siempre que estoy comprobando para la igualdad entre una variable y cadena como,Minificación de Javascript de las declaraciones de comparación

a == "13" || a == "40" 

cierre reemplaza con

"13" == a || "40" == a 

Por qué se realiza esta modificación? ¿Hay alguna ventaja de rendimiento aquí?

Respuesta

5

[ACTUALIZACIÓN: Ver @ respuesta de Juan, tiene más sentido de por qué un Minifier js haría esto, y debe ser la respuesta aceptada]

Como concepto general, esto es para evitar error del programador . Si estaba modificando el código manualmente y colocando la variable primero y el segundo constante, es posible escribir accidentalmente:

a == '40' || a = '13' 

¡Uy! Acabamos de establecer a en '13' en lugar de comparar. Al poner la constante de la izquierda, se evita esta posibilidad:

'40' == a || '13' = a 

arrojará una excepción porque no se puede poner una cadena constante en la mano izquierda de una operación de asignación.

Por lo tanto, en algunas escuelas de pensamiento, es mejor poner siempre la constante de la izquierda al hacer una comparación de igualdad con una constante. Parece que el cierre sigue esa práctica.

Se llaman "condiciones yoda".

Tenga en cuenta que mi preferencia personal es simplemente poner la constante a la derecha en la mayoría de los casos, porque el código tiende a leer mejor, por lo que no creo que la compensación sea lo suficientemente buena. Pero veo la lógica detrás de las condiciones de yoda.

+0

Eso no explica por qué un compresor lo haría. OT: ¿Realmente eliminaron el [hilo en las condiciones de Yoda] (http://webcache.googleusercontent.com/search?q=cache:stackoverflow.com/questions/2349378/new-programming-jargon-you-coined+jargon+ acuñado)? – user123444555621

+0

El compresor utiliza las mejores prácticas siempre que sea posible, solo porque puede hacerlo. (¿Ojalá alguien edite la versión minimizada?) –

+0

Además, no estaba al tanto de ese hilo sobre las condiciones de yoda. Acabo de escuchar esto descrito de esa manera antes. –

9

Esto se hace para una menor ventaja de compresión gzip. Si tiene "x == 1" y "1 == x", el compilador lo cambiará a "1 == x" en ambos casos y obtendrá un código más regular que se comprime mejor. La victoria es tan pequeña, que he considerado eliminar el código y guardar los ciclos de CPU, pero está listo por ahora. No tiene nada que ver con la prevención de errores del programador ya que nunca cambiará "x = 2" en "2 = x" ya que eso cambiaría el significado del programa.

+1

Tiene sentido. OP (@ user843241) debería cambiar esto a la respuesta aceptada. Eliminaría mi propia respuesta, pero no sé si eso sería kosher. Aunque solo para el registro, las Condiciones de Yoda nunca dicen nada sobre el orden de los operandos en la asignación; por supuesto, nunca cambiarías "x = 2" en "2 = x". Las condiciones de Yoda se refieren al orden de los operandos en la comparación de igualdad solamente. –

Cuestiones relacionadas