ECMAScript es un estándar de JavaScript desarrollado por Ecma International . Desde 2015, se publican versiones principales cada mes de junio.
ECMAScript 2024, la versión 15 y actual, se lanzó en junio de 2024.
En junio de 2004, Ecma International publicó el estándar ECMA-357, que define una extensión de ECMAScript, conocida como ECMAScript para XML (E4X). Ecma también definió un "perfil compacto" para ECMAScript, conocido como ES-CP o ECMA 327, que fue diseñado para dispositivos con recursos limitados y que fue retirado en 2015. [14]
La cuarta edición propuesta de ECMA-262 ( ECMAScript 4 o ES4 ) habría sido la primera actualización importante de ECMAScript desde que se publicó la tercera edición en 1999. La especificación (junto con una implementación de referencia) originalmente estaba prevista para completarse en octubre de 2008. [15] El primer borrador estaba fechado en febrero de 1999. [16] El grupo de trabajo publicó una descripción general del lenguaje el 23 de octubre de 2007. [17]
En agosto de 2008, la propuesta de la cuarta edición de ECMAScript se había reducido a un proyecto cuyo nombre en código era ECMAScript Harmony. Las características que se estaban discutiendo para Harmony en ese momento incluían:
La intención de estas características era, en parte, mejorar la compatibilidad con la programación a gran escala y permitir sacrificar parte de la capacidad del script de ser dinámico para mejorar el rendimiento. Por ejemplo, Tamarin (la máquina virtual para ActionScript, desarrollada y de código abierto por Adobe) tiene compatibilidad con compilación en tiempo real (JIT) para ciertas clases de scripts.
Además de introducir nuevas características, se propuso corregir algunos errores de ES3 en la edición 4. [18] [19] Estas correcciones y otras, y el soporte para codificación/decodificación JSON , se han incorporado a la especificación ECMAScript, 5.ª edición. [20]
El trabajo en la Edición 4 comenzó después de que se completara la especificación ES-CP (Compact Profile), y continuó durante aproximadamente 18 meses, donde se logró un progreso lento para equilibrar la teoría de la especificación JavaScript 2 de Netscape con la experiencia de implementación de JScript .NET de Microsoft. Después de algún tiempo, el enfoque se desplazó al estándar ECMAScript para XML (E4X). La actualización no ha estado libre de controversias. A fines de 2007, un debate entre Eich, más tarde CTO de la Fundación Mozilla , y Chris Wilson, arquitecto de la plataforma de Microsoft para Internet Explorer , se hizo público en varios blogs . Wilson advirtió que debido a que los cambios propuestos a ECMAScript lo hacían incompatible con versiones anteriores del lenguaje en algunos aspectos, la actualización equivalía a "romper la Web", [21] y que las partes interesadas que se oponían a los cambios estaban siendo "ocultadas". [22] Eich respondió afirmando que Wilson parecía estar "repitiendo falsedades en blogs" y negó que hubiera un intento de suprimir el disenso y desafió a los críticos a dar ejemplos específicos de incompatibilidad. [23] Señaló que Microsoft Silverlight y Adobe AIR se basan en C# y ActionScript 3 respectivamente, los cuales son más grandes y complejos que ECMAScript Edition 3. [24]
Yahoo, Microsoft, Google y otros disidentes de la cuarta edición formaron su propio subcomité para diseñar una actualización menos ambiciosa de ECMAScript 3, denominada provisionalmente ECMAScript 3.1. Esta edición se centraría en la seguridad y las actualizaciones de bibliotecas, con un gran énfasis en la compatibilidad. Después del debate público mencionado anteriormente, los equipos de ECMAScript 3.1 y ECMAScript 4 acordaron un compromiso: se trabajaría en las dos ediciones en paralelo, con coordinación entre los equipos para garantizar que ECMAScript 3.1 siga siendo un subconjunto estricto de ECMAScript 4 tanto en semántica como en sintaxis.
Sin embargo, las diferentes filosofías en cada equipo resultaron en repetidas violaciones de la regla del subconjunto, y seguía siendo dudoso que los disidentes de ECMAScript 4 apoyaran o implementaran ECMAScript 4 en el futuro. Después de más de un año desde el desacuerdo sobre el futuro de ECMAScript dentro del Comité Técnico 39 de Ecma, los dos equipos llegaron a un nuevo compromiso en julio de 2008: Brendan Eich anunció que Ecma TC39 centraría el trabajo en el proyecto ECMAScript 3.1 (posteriormente renombrado a ECMAScript, 5.ª edición) con la plena colaboración de todas las partes, y los proveedores apuntarían al menos a dos implementaciones interoperables para principios de 2009. [25] [26] En abril de 2009, Ecma TC39 publicó el borrador "final" de la 5.ª edición y anunció que se esperaba que las pruebas de las implementaciones interoperables se completaran a mediados de julio. [27] El 3 de diciembre de 2009 se publicó la quinta edición de la norma ECMA-262. [28]
Las adiciones incluyen JSON , String.trim()
para eliminar fácilmente los espacios en blanco que rodean una cadena ( " example "
to "example"
), String.charAt()
para devolver un solo carácter de una posición dada en una cadena y Array.isArray()
. Una coma después del par final de valores en un objeto ( var example = { "property1":"value1", "property2":"value2", }
) tampoco causa un error de sintaxis. [29]
La sexta edición, ECMAScript 6 ( ES6 ) y posteriormente renombrada como ECMAScript 2015, se finalizó en junio de 2015. [4] [30] Esta actualización agrega una nueva sintaxis significativa para escribir aplicaciones complejas, incluidas las declaraciones de clase ( ), módulos ES6 como , pero los define semánticamente en los mismos términos que el modo estricto de ECMAScript 5. Otras características nuevas incluyen iteradores y bucles, generadores de estilo Python , expresión de función de flecha ( ), palabra clave para declaraciones locales, palabra clave para declaraciones locales constantes, datos binarios, matrices tipadas, nuevas colecciones (mapas, conjuntos y WeakMap), promesas , mejoras numéricas y matemáticas, reflexión, proxies (metaprogramación para objetos virtuales y envoltorios) y literales de plantilla que usan comillas invertidas ( ) para cadenas de varias líneas sin caracteres de escape . [31] [32] La lista completa es extensa. [33] [34] Como la primera especificación "ECMAScript Harmony", también se conoce como "ES6 Harmony".class Foo { ... }
import * as moduleName from "..."; export const Foo
for...of
() => {...}
let
const
`
La séptima edición, o ECMAScript 2016, se finalizó en junio de 2016. [5] Sus características incluyen el operador de exponenciación **
para números, await
, async
palabras clave para programación asincrónica (como preparación para ES2017) y la Array.prototype.includes
función. [5] El operador de exponenciación es equivalente a Math.pow
, pero proporciona una sintaxis más simple similar a lenguajes como Python, F#, Perl y Ruby. async
/ await
fue aclamado como una forma más fácil de usar promesas y desarrollar código asincrónico.
La octava edición, o ECMAScript 2017, se finalizó en junio de 2017. [6] Sus características incluyen las funciones Object.values
, Object.entries
y para una fácil manipulación de objetos, / construcciones que usan generadores y promesas, y características adicionales para concurrencia y atómica . También incluye . [35] [6]Object.getOwnPropertyDescriptors
async
await
String.prototype.padStart()
La novena edición, o ECMAScript 2018, se finalizó en junio de 2018. [7] Las nuevas características incluyen el operador de propagación y los parámetros de descanso ( ...
) para literales de objetos, iteración asincrónica Promise.prototype.finally
y adiciones a RegExp. [7]
El operador de propagación permite copiar fácilmente las propiedades de los objetos, como se muestra a continuación.
deje que el objeto = { a : 1 , b : 2 } let objectClone = Object . allow ({}, object ) // antes de ES2018 let objectClone = {... object } // sintaxis de ES2018 deje que otroObjeto = { c : 3 , ... objeto } console . log ( otroObjeto ) // -> {c: 3, a: 1, b: 2}
La décima edición, o ECMAScript 2019, se publicó en junio de 2019. [8] Las características agregadas incluyen, entre otras, Array.prototype.flat
, Array.prototype.flatMap
, cambios en Array.sort
, y Object.fromEntries
. [8]
Array.sort
ahora se garantiza que es estable , lo que significa que los elementos con claves de clasificación iguales no cambiarán el orden relativo antes y después de la operación de clasificación. Array.prototype.flat(depth=1)
aplana una matriz a una profundidad especificada, lo que significa que todos los elementos de la submatriz (hasta la profundidad especificada) se concatenan de forma recursiva.
Otro cambio notable es que el llamado enlace catch pasó a ser opcional. [36]
La undécima edición, o ECMAScript 2020, se publicó en junio de 2020. [9] Además de nuevas funciones, esta versión introduce un BigInt
tipo primitivo para números enteros de tamaño arbitrario, el operador de coalescencia nula y el objeto globalThis . [9]
Los BigInts se crean con el BigInt
constructor o con la sintaxis 10n
, donde "n" se coloca después del literal numérico. Los BigInts permiten la representación y manipulación de números enteros más allá de , mientras que los números se representan mediante un valor IEEE 754Number.MAX_SAFE_INTEGER
de 64 bits de doble precisión . Las funciones integradas en no son compatibles con BigInts; por ejemplo, la exponenciación de BigInts debe realizarse con el operador en lugar de .Math
**
Math.pow
El operador de fusión nulo, ??
, devuelve su operando del lado derecho cuando su lado izquierdo es null
o undefined
. Esto contrasta con el ||
operador , que devolvería "string"
todos los valores "falsos", como los que se muestran a continuación.
indefinido ?? "cadena" // -> "cadena" nulo ?? "cadena" // -> "cadena" falso ?? "cadena" // -> falso NaN ?? "cadena" // -> NaN
El encadenamiento opcional permite acceder a las propiedades anidadas de un objeto sin tener que realizar una comprobación AND en cada nivel. Un ejemplo es const zipcode = person?.address?.zipcode
. Si alguna de las propiedades no está presente, zipcode
estará undefined
.
La 12.ª edición, ECMAScript 2021, se publicó en junio de 2021. [10] Esta versión introduce el replaceAll
método para cadenas; Promise.any
, un combinador de promesas que se cortocircuita cuando se cumple un valor de entrada; AggregateError
, un nuevo tipo de error para representar varios errores a la vez; operadores de asignación lógica ( ??=
, &&=
, ||=
); WeakRef
, para hacer referencia a un objeto de destino sin preservarlo de la recolección de basura, y FinalizationRegistry
, para gestionar el registro y la anulación del registro de las operaciones de limpieza realizadas cuando los objetos de destino se recolectan como basura; separadores para literales numéricos ( 1_000
); y Array.prototype.sort
se hizo más preciso, reduciendo la cantidad de casos que dan como resultado un orden de clasificación definido por la implementación.
La 13.ª edición, ECMAScript 2022, se publicó en junio de 2022. [11] Esta versión introduce el nivel superior await
, que permite utilizar la palabra clave en el nivel superior de los módulos; nuevos elementos de clase: campos de instancia públicos y privados, campos estáticos públicos y privados, métodos y accesores de instancia privados, y métodos y accesores estáticos privados; bloques estáticos dentro de las clases, para realizar la inicialización de la evaluación por clase; la #x in obj
sintaxis, para probar la presencia de campos privados en los objetos; índices de coincidencia de expresiones regulares a través del /d
indicador, que proporciona índices de inicio y fin para las subcadenas coincidentes; la cause
propiedad en Error
los objetos, que se puede utilizar para registrar una cadena de causalidad en errores; el at
método para cadenas, matrices y matrices con tipos, que permite la indexación relativa; y Object.hasOwn
, una alternativa conveniente a Object.prototype.hasOwnProperty
.
La 14.ª edición, ECMAScript 2023, se publicó en junio de 2023. [37] Esta versión introduce los métodos toSorted
, toReversed
, with
, findLast
y en y , así como el método en ; agregó soporte para comentarios shebang al comienzo de los archivos para facilitar mejor la ejecución de archivos ECMAScript; y permitió el uso de la mayoría de los símbolos como claves en colecciones débiles.findLastIndex
Array.prototype
TypedArray.prototype
toSpliced
Array.prototype
#!
La 15.ª edición, ECMAScript 2024, se publicó en junio de 2024. [38] Esta versión presenta los métodos estáticos Object.groupBy
y , y el indicador Unicode para expresiones regulares.Map.groupBy
Promise.withResolvers
/v
Los métodos Object.groupBy
y Map.groupBy
agrupan un iterable utilizando el valor de retorno de una función de devolución de llamada proporcionada.
// datos de muestra const arr = [ { año : "2024" , id : 0 }, { año : "2023" , id : 1 }, { año : "2024" , id : 2 }, ]; const obj = Object . groupBy ( arr , ( el ) => el . year ); console . log ( obj ); // { "2024": [{ año: "2024", id: 0 }, { año: "2024", id: 2 }], "2023": [{ año: "2023", id: 1 }] }
Promise.withResolvers
proporciona una forma sencilla de obtener las funciones de resolución y rechazo de una promesa directamente sin tener que asignarlas en el constructor. [39]
// ES 2023 deje que se resuelva ; deje que se rechace ; deje que se prometa = new Promise (( res , rej ) => { resolver = res ; rechazar = rej ; }); // ES 2024 const { resolver , rechazar , prometer } = Promise.withResolvers () ;
La /v
bandera en expresiones regulares es simplemente una versión mejorada de la /u
bandera, pero como hace cambios incompatibles con versiones anteriores, tuvo que ser introducida como una nueva bandera. [40]
ES.Next es un nombre dinámico que hace referencia a la próxima versión en el momento de la redacción. Las características de ES.Next incluyen propuestas finalizadas (también conocidas como "propuestas de etapa 4"), que se enumeran en las propuestas finalizadas que no forman parte de una especificación ratificada. El comité de lenguaje sigue un modelo de "especificación viva", por lo que estos cambios son parte del estándar y la ratificación es una formalidad. [41]
{{cite web}}
: CS1 maint: bot: estado de URL original desconocido ( enlace ){{cite web}}
: CS1 maint: bot: estado de URL original desconocido ( enlace ){{cite web}}
: CS1 maint: estado de la URL ( enlace ){{cite web}}
: CS1 maint: URL no apta ( enlace ){{cite web}}
: CS1 maint: bot: estado de URL original desconocido ( enlace )