5

Admito que hice una pregunta acerca de por qué Closure Compiler no acorta un código que parece acortable a primera vista hace unos días, pero ese motivo no es aplicable en este caso y no estoy muy seguro de por qué no lo es. t acortado aquí.Compilador de cierre: ¿puede a ++> = 3 convertirse en ++ a> 3?

¿Qué código tengo es:

var a = 0; 
function b() { 
    return a++ >= 3; 
} 

Ahora no es pre-incremento y post-incremento. La diferencia es el valor de retorno - a++ vuelve a y luego incrementos de TI, ++a primeros incrementos a y luego lo devuelve.

Lo que esto se reduce a es que mi código podría reducirse a (ignorando la eliminación espacios en blanco):

var a = 0; 
function b() { 
    return ++a > 3; 
} 

Sin embargo, Closure Compiler no parece alterar (o reconocer) esto.

Mi pregunta por lo tanto es: ¿qué efectos secundarios podría tener ++a > cuando se usa en lugar de a++ >=?

+0

¿Por qué querrías que hiciera eso? No veo cómo mejorará el rendimiento de ninguna manera. –

+0

No por el rendimiento, sino por la longitud del código. Closure Compiler está ahí para acortar el código eliminando espacios en blanco y mucho más, por lo que 'a ++> = 3' podría acortarse a' ++ a> 3'. No es muy emocionante pero me preguntaba. – pimvdb

+3

necesita cumplir 2 condiciones y la ganancia es muy pequeña, por lo que probablemente ni siquiera hayan perdido el tiempo o se hayan enfocado en cosas más importantes ... – fazo

Respuesta

7

Hay es un borde particular para este constructo (pero no para 3).

Ocurre porque JavaScript almacena los números como IEEE-754 coma flotante de 64 bits dobles y "solo" tiene una representación de enteros "exacta" garantizada de hasta 2^53 (aunque las implementaciones pueden tener un margen de error para tener una rango más alto, no sé).

Esto es en Firefox 4:

a = 2e53 
a++ >= 2e53 // true 

a = 2e53 
++a > 2e53 // false 

pregunta real es lo Ganancia sería tal transformación muy particular tienen? : -0

Happy coding.

+0

En Firebug, Firefox 3.6 '(Number.MAX_VALUE + 1) === Number.MAX_VALUE' is' true' –

+0

También en Chrome, sin embargo 'Number.MAX_VALUE + 1e308 === Infinity'. También Chrome parece subir a 'e + 308'. – pimvdb

1

¿Por qué no comprueba usted mismo todas las condiciones de borde?

function b(a) { 
    return a++ >= 3; 
} 

function b2(a) { 
    return ++a > 3; 
} 

console.log(b(2) === b2(2)) 
console.log(b(3) === b2(3)) 
console.log(b(4) === b2(4)) 

La salida es true en cada caso.

+0

Sí, así que mi pregunta real fue por qué Closure Compiler lo ignora. – pimvdb

2

Es seguro para aplicar este tamaño de optimización de si el derecho-operando (3 en su ejemplo) es un número entero constante en el intervalo [-2 , 2 ]. En cualquier otro caso (por ejemplo, si el operando derecho es fraccionario o muy grande), no es seguro.

Me imagino que el cierre no implementa esta optimización porque:

  • que requiere una gran cantidad de comprobación para asegurarse de que la optimización es seguro,
  • que sólo se aplica en circunstancias muy específicas que probablemente Don' aparece muy a menudo, y
  • Guarda solo un carácter, lo que no parece valer la pena.
Cuestiones relacionadas