Photo by chansu shin on Unsplash

On this page

This page follows How ECMAScript is standardized. It is a scan list, not a tutorial. For narrative context, see A short history of JavaScript.

ES5 (2009)

Addition Notes
Strict mode "use strict"
JSON parse, stringify
Array extras forEach, map, filter, reduce, …
Object methods keys, seal, freeze, getters/setters
Function.prototype.bind Partial application

ES2015 (ES6)

Addition Notes
let, const Block scope
Classes Syntactic sugar over prototypes
Modules import / export
Arrow functions Lexical this
Promises Built-in async primitive
Map, Set, WeakMap, WeakSet Collections
Template literals `hello ${name}`
Destructuring Arrays and objects
Default and rest parameters function f(a = 1, ...rest)
Iterators / generators function*, yield
Symbols Symbol(), well-known symbols
for..of Iteration protocol

ES2016

Addition Notes
** Exponentiation operator
Array.prototype.includes Like indexOf but with NaN handling

ES2017

Addition Notes
async / await Promise syntax
Object.entries, Object.values Key/value lists
SharedArrayBuffer, Atomics Shared memory (with isolation requirements)
String padding padStart, padEnd
Trailing commas in param lists Syntax only

ES2018

Addition Notes
Rest/spread for objects { ...obj }
Async iteration for await, async generators
Promise.prototype.finally Cleanup hook
RegExp improvements Named groups, lookbehind, dotAll

ES2019

Addition Notes
Array.prototype.flat, flatMap Nested arrays
Object.fromEntries Inverse of entries
Optional catch binding catch { } without (e)
String.prototype.trimStart/End Aliases trimLeft/Right
Symbol.prototype.description Read symbol debug name

ES2020

Addition Notes
Optional chaining obj?.prop, fn?.()
Nullish coalescing a ?? b
BigInt Arbitrary integers
globalThis Cross-environment global
Dynamic import() Promise-based module load
Promise.allSettled Wait for all outcomes
String.prototype.matchAll Iterator of matches

ES2021

Addition Notes
Logical assignment &&=, ||=, ??=
Numeric separators 1_000_000
Promise.any First fulfillment
WeakRef, FinalizationRegistry Weak lifecycle hooks
String.prototype.replaceAll Global replace without regex

ES2022

Addition Notes
Class fields Public and private # fields
Class static blocks static { }
Top-level await in modules Module scope
at() on arrays and strings Negative indexing
RegExp match indices d flag, indices
Object.hasOwn Safer than hasOwnProperty
Error cause new Error("msg", { cause })

ES2023

Addition Notes
Array find from end findLast, findLastIndex
Immutable array methods toSorted, toReversed, toSpliced, with
Hashbang grammar #! in scripts
Symbols as weak map keys WeakMap accepts symbols

ES2024

Addition Notes
ArrayBuffer.prototype.transfer Resizable buffers
Object.groupBy, Map.groupBy Group collections
Promise.withResolvers External resolve/reject
Well-formed Unicode strings isWellFormed, toWellFormed
Atomics.waitAsync Async wait on shared memory

ES2025 (representative)

Addition Notes
Iterator helpers Iterator.prototype.map, .filter, …
Set methods union, intersection, difference, …
Import attributes import json from "./x.json" with { type: "json" }
RegExp escaping RegExp.escape for literal fragments

Editions after publication continue on tc39/proposals. Verify shipping in your target engines before relying on stage-4 syntax in production without transpilation.

Continue with JavaScript under the hood.

Search articles

Type a word to search published articles.

Open the search page