A Brief History

A Brief History: from Mocha to ECMAScript 2026

In May 1995 Brendan Eich built a prototype language for Netscape Navigator in about ten days. Management wanted it to look like Java, so it got curly braces, while its core borrowed first-class functions from Scheme and prototypes from Self. Called Mocha, then LiveScript in the September 1995 beta of Navigator 2.0, it was renamed JavaScript when Netscape and Sun announced it on December 4, 1995. Quick decisions from those ten days survive: typeof null returns "object" because the prototype tagged null like an object.

In November 1996 Netscape took the language to Ecma International for standardization. The standard is ECMA-262, the language it defines is ECMAScript, and JavaScript is its best-known implementation.

Milestones of JavaScript and ECMAScript (not to scale)
Milestones of JavaScript and ECMAScript (not to scale)

The first edition was adopted in June 1997 and the third, with regular expressions and try/catch, in December 1999. An ambitious fourth edition with classes and optional types split the committee and was abandoned in July 2008 in favor of the smaller ES5 (December 2009) and a long-term "Harmony" plan. That plan became ES2015 (ES6): let, const, classes, modules, arrow functions and promises. Since then TC39 ships a smaller edition every June, named after its year (The TC39 Process explains how features get in, Version Features lists them by edition).

Ecma's General Assembly approved ECMAScript 2026 on June 30, 2026. It adds Map.prototype.getOrInsert(), Iterator.concat(), Uint8Array.fromBase64() and toBase64(), Math.sumPrecise(), Error.isError(), Array.fromAsync() and access to the source text in JSON.parse() revivers. Temporal (Date) and using declarations have since reached Stage 4 and are slated for ES2027.

Engines lag editions, so detect features rather than assuming a year. Node.js 25.8 2,131 (V8 14.1 86,723 ) printed this:

Feature-detecting recent additionsJavaScriptLive
const checks = {
  'ES2025 Iterator helpers': typeof Iterator?.prototype?.map === 'function',
  'ES2026 Error.isError': typeof Error.isError === 'function',
  'ES2026 Uint8Array.fromBase64': typeof Uint8Array.fromBase64 === 'function',
  'ES2026 Math.sumPrecise': typeof Math.sumPrecise === 'function',
  'ES2026 Map getOrInsert': typeof Map.prototype.getOrInsert === 'function',
};
for (const [feature, ok] of Object.entries(checks)) {
  console.log(`${ok ? 'yes' : 'no '}  ${feature}`);
}