ECMASCRIPT es la especificación donde se mencionan todos los detalles relacionados cómo debe funcionar y comportarse javascript en un navegador. De esta forma, los diferentes navegadores (Chrome, Firefox, Opera, Edge, Safari, etc…) saben como deben desarrollar los motores de javascript para que cualquier código o programa funcione exactamente igual, independientemente del navegador que se utilice.
Teniendo esto en cuenta, debemos saber que los navegadores web intentan cumplir la especificación ECMAScript al máximo nivel, pero no todos ellos lo consiguen. Por lo tanto, pueden existir ciertas discrepancias. Por ejemplo, pueden existir navegadores que cumplan la especificación por ejemplo ECMAScript 6 al 70% y otros que sólo cumplan al 50%. Esto significa que pueden haber características que no funcionen en un navegador específico y en otros sí.
Por ende es importante considerar mantener los navegadores actualizados, todo va cambiando y los navegadores se ven obligados a lanzar nuevas versiones para brindar mayor compatibilidad con ECMAScript* más moderno.
A lo largo de los años, javascript ha ido sufriendo modificaciones que los navegadores han ido implementando para acomodarse a la última versión de ECMASCript cuanto antes. La lista de versiones de ECMASCript aparecidas hasta el momento son las siguientes, donde encontraremos las versiones enmarcadas en lo que podemos considerar el pasado de javascript:
Edición | Fecha | Nombre formal>informal | Cambios significativos |
---|---|---|---|
1 | JUN/1997 (ES1) | ECMAScript 1997 (ES1) | Primera edición |
2 | JUN/1998 | ECMAScript 1998 (ES2) | Cambios leves |
3 | DIC/1999 | ECMAScript 1999 (ES3) | RegExp, try/catch, etc... |
4 | AGO/2008 | ECMAScript 2008 (ES4) | Versión abandonada |
5 | DIC/2009 | ECMAScript 2009 (ES5) | Strict mode, JSON, etc... |
5.1 | DIC/2011 | ECMAScript 2011 (ES5.1) | Cambios leves |
A partir del año 2015, se marcó un antes y un después en el mundo de javascript, estableciendo una serie de cambios que lo tranformarían en un lenguaje moderno, partiendo desde la especificación de dicho año, hasta la actualidad:
Edición | Fecha | Nombre formal>informal | Cambios significativos |
---|---|---|---|
6 | JUN/2015 | ES2015 | Clases, módulos, hashmaps, sets, for of, proxies... |
7 | JUN/2016 | ES2016 | Clases, módulos, hashmaps, sets, for of, proxies... |
8 | JUN/2017 | ES2017 | Async/Await |
9 | JUN/2018 | ES2018 | Rest/Spread operator, Promise.finally()... |
10 | JUN/2019 | ES2019 | flat, flatMap, trimStart(), optional error catch... |
11 | JUN/2020 | ES2020 | Dynamicc imports, BigInt, Promise.allSettled |
En ocasiones, algunos navegadores deciden adelantarse en implementar pequeñas funcionalidades de versiones posteriores de ECMAScript antes que otras, para ir testeando y probando características, por lo que no es raro que algunas características de futuras especificaciones puedan estar implementadas en algunos navegadores.
Una buena forma de conocer en que estado se encuentra un navegador concreto en su especificación de ECMAScript es consultando la tabla de compatibilidad Kangax.
Dicho esto, teniendo en cuenta todos estos detalles, es muy habitual que el programador estpe confuso en como empezar a programar y que versión ECMASCript adoptar como preferencia.
Generalmente, el programador suele tomar una de las siguientes estrategias <<crossbrowser>> para asegurarse que el código funcionará en todos los navegadores:
Enfoque | Código escrito | Descripción |
---|---|---|
Conservador | ECMAScript 5 | Incómodo de escribir. Anticuado. Compatible con navegadores nativamente. |
Delegador | Depende | Cómodo. Rápido. Genera dependencia al framework/librería. |
Evergreen | Ecmascript 6+ | Cómodo. Moderno. No garantiza la compatibilidad en navegadores antiguos. |
Transpilador | ECMAScript 6+ | Cómodo. Moderno. Preparado para el futuro. Requiere preprocesado. |