2. History and Versions
The Origins
ECMAScript was born out of the need to standardize JavaScript implementations across different browsers. In the mid-1990s, Netscape created JavaScript, while Microsoft developed JScript. This led to compatibility issues.
ECMAScript 1 (1997)
- First standardized version
- Based on JavaScript 1.1
- Basic language features: variables, functions, objects, arrays
ECMAScript 2 (1998)
- Minor updates and clarifications
- Alignment with ISO/IEC 16262 standard
ECMAScript 3 (1999)
- Major update with significant new features:
- Regular expressions
- Better string handling
try/catchexception handlingdo-whileloopsinandinstanceofoperators
ECMAScript 4 (Abandoned)
- Ambitious update planned for 2000
- Too many changes caused controversy
- Eventually abandoned in 2008
ECMAScript 5 (2009)
- Focus on bug fixes and minor improvements
- Added "strict mode"
- JSON support
- New array methods:
forEach,map,filter,reduce Object.create(),Object.defineProperty()
ECMAScript 6 / ES2015 (2015)
- Major overhaul with many new features:
letandconstdeclarations- Arrow functions
- Classes
- Modules
- Promises
- Template literals
- Destructuring
- Default parameters
- Rest/spread operators
ECMAScript 2016 (ES7)
Array.prototype.includes()- Exponentiation operator (
**)
ECMAScript 2017 (ES8)
async/awaitObject.values(),Object.entries()- String padding methods
- Trailing commas in function parameters
ECMAScript 2018 (ES9)
- Asynchronous iteration
- Rest/spread properties
Promise.finally()- Regular expression improvements
ECMAScript 2019 (ES10)
Array.prototype.flat()Object.fromEntries()String.prototype.trimStart()andtrimEnd()- Optional catch binding
ECMAScript 2020 (ES11)
- BigInt
- Dynamic imports
Promise.allSettled()- Nullish coalescing operator (
??) - Optional chaining (
?.)
ECMAScript 2021 (ES12)
String.prototype.replaceAll()- Numeric separators
- Logical assignment operators (
&&=,||=,??=) Promise.any()
ECMAScript 2022 (ES13)
- Top-level
await - Class field declarations
- Private methods and fields
- Ergonomic brand checks
ECMAScript 2023 (ES14)
Array.prototype.findLast()andfindLastIndex()- Hashbang grammar
- Symbols as WeakMap keys
ECMAScript 2024 (ES15)
- Array grouping:
Array.prototype.groupandgroupToMap() Promise.withResolvers()for ergonomic deferred Promises- RegExp
vflag with Unicode set notation and properties of strings - Resizable/growable
ArrayBufferandSharedArrayBuffer ArrayBuffer.prototype.transfer()andtransferToFixedLength()Atomics.waitAsync- Well-formed Unicode strings
ECMAScript 2025 (ES16)
- New
Setmethods:union,intersection,difference,symmetricDifference,isSubsetOf,isSupersetOf,isDisjointFrom - Iterator helpers (sync):
Iterator.from,.map,.filter,.take,.drop,.flatMap,.reduce,.toArray,.forEach,.some,.every,.find Promise.try()to wrap sync/async functions with same-tick semantics- JSON Modules and Import Attributes:
import data from "./data.json" with { type: "json" } - RegExp modifiers: scoped flag changes like
(?i:...) - Duplicate named capture groups in RegExp alternatives
RegExp.escape()to safely escape strings for use in patterns- Float16 support:
Float16Array,DataView#getFloat16/setFloat16,Math.f16round
Current Status
As of 2025, ECMAScript continues to evolve with annual releases. ES2025 (ES16) is the latest edition, with broad support arriving in modern browsers and current Node.js versions.
Browser Support
- Modern browsers support ES6+ features
- Use tools like Babel for older browser compatibility
- Node.js supports most modern features
Version Naming Convention
- ES6 = ES2015
- ES7 = ES2016
- And so on...
Next Steps
Now that you understand ECMAScript's evolution, let's set up your development environment to start coding!