Suite de prueba automatizada es sin duda una buena idea.
Desde más y más implementaciones implementan ES5 ahora, ejecutar el banco de pruebas para su secuencia de comandos/biblioteca/aplicación en los navegadores más nuevos es una buena forma de garantizar la compatibilidad.
Tengo un ES5 compatibility table, que enumera el nivel de compatibilidad de algunas de las implementaciones más populares. No es exhaustivo, pero muestra la dirección general: el último IE, WebKit, Chrome y Firefox tienen un buen soporte para ES5. Para una prueba de conformidad completa, siempre puede ejecutar el conjunto de pruebas oficial de ES5 (que tengo en línea para mayor comodidad right here).
Si no existe un conjunto de pruebas (que realmente debería existir, ya que es muy útil por otros motivos), puede ejecutar script/biblioteca/aplicación en una de las implementaciones más recientes (conforme a ES5) y ver qué funciona y lo que falla
Consultar Annex E es otra manera de hacerlo. Tenga en cuenta que, aunque la lista parece bastante grande, no es tan mala como parece. Uno de los objetivos de ES5 era hacer la transición de ES3 más o menos indolora, moviendo cambios más radicales en el ámbito de opt-in modo estricto.
Es probable que muchos cambios de compatibilidad de esa lista pasen desapercibidos. Tomemos como ejemplo, cambie en 15.1.1, donde global undefined
, NaN
y ahora son de solo lectura.Teniendo en cuenta que las aplicaciones en buen estado no reasignan estas propiedades globales, excepto por error, este cambio es más un "receptor de error" agradable en lugar de "interruptor de aplicación".
Otro cambio liekly inocente está en 15.10.2.12, en clase de caracteres de espacio en blanco (\s
) ahora también coincide con < lista de materiales> (U+FEFF
) carácter. Teniendo en cuenta all the deviations en las implementaciones actuales (incluso en lo que respecta a ES3), es probable que este cambio pase desapercibido en la mayoría de las aplicaciones.
Sin embargo, también hay cambios más peligrosos, como el de parseInt
y la forma en que ya no se trata a las cadenas que comienzan con 0 como valores octales. parseInt('010')
ya no debería producir 8
(aunque algunas implementaciones eligen deliberately violate that behavior). Y aún así, confiar en parseInt
sin un segundo argumento "raíz" nunca fue una buena práctica. Entonces, si su aplicación siempre especifica radix, no hay nada de qué preocuparse.
Consulte el Anexo E, pruebe su script en las implementaciones más nuevas (preferiblemente, varias) y siga las mejores prácticas. Esa es una buena forma de garantizar la compatibilidad.
Su conjunto de pruebas es realmente bueno. Sin embargo, me temo que no ayudará con mi situación particular. Básicamente, mi compañía necesita asegurarse de que nuestros scripts heredados no causen ningún problema en las instalaciones de nuestros clientes. Estamos hablando de cientos y cientos de scripts aquí, y comprobar manualmente cada funcionalidad parece un gran dolor. ("¿Pruebas unitarias? ¿Qué es eso?") Actualmente, me temo que simplemente estamos esperando informes de errores. – user123444555621
¿Qué tal si ejecuta scripts a través de JSLint? Uno por uno, poco a poco.Es posible que JSLint no cubra todos los cambios sensibles a compat, pero sin duda lo acercará. Advertirá sobre parseInt sin radix y sobre los nombres de propiedad como palabras clave (por ejemplo, '({if: 1})') y otros. – kangax
Lamentablemente, JSLint informará miles de errores y, ocasionalmente, se negará a continuar (por ejemplo, al presionar 'void') aunque los scripts funcionen correctamente en ES3. De hecho, he hecho algunos mods JSLint en el pasado, y estoy pensando en agregar algunas cosas de ES5 también. Sin embargo, algunas de las incompatibilidades (7.8.5/1, 10.4.2, 10.6/2, 15.3.4.3, 15.3.4.4, 15.10.2.12) son muy difíciles de encontrar en el momento del análisis. – user123444555621