Fundamentals 7 min read

Inside ECMA TC39: How JavaScript Proposals Evolve from Idea to Standard

This article explains the role of ECMA TC39, its meeting cadence, member composition, proposal stages from Strawman to Finished, and highlights key updates from the 105th meeting including new Intl.DurationFormat, Error.isError, ESM Phase Imports, immutable ArrayBuffer, and currency display options.

Code Mala Tang
Code Mala Tang
Code Mala Tang
Inside ECMA TC39: How JavaScript Proposals Evolve from Idea to Standard

About ECMA TC39

https://github.com/tc39/agendas/blob/main/2024/12.md

ECMA TC39 (ECMA Technical Committee 39) is the technical committee of Ecma International responsible for defining and maintaining the ECMAScript standard, the language specification behind JavaScript.

TC39 was founded in 1996, originating from the development and standardisation of JavaScript.

The committee meets six times a year, roughly every two months, with each meeting lasting three to four days to discuss and advance JavaScript language proposals.

Members include browser vendors (Google, Microsoft, Mozilla), technology companies (Meta, Netflix), community projects (Babel, TypeScript), academic institutions, and occasionally external experts.

Main agenda items:

Discussion and voting on proposals (e.g., advancing to the next stage).

Revision of ECMAScript specification issues.

Feedback and progress on browser engines and toolchains.

Data analysis and community discussion of language feature usage.

Each change goes through multiple stages:

Stage 0: Strawman – initial idea presented for discussion.

Stage 1: Proposal – problem and solution are defined, entering formal proposal.

Stage 2: Draft – design stabilises, a draft specification is provided.

Stage 3: Candidate – specification is complete, implementation feedback is collected.

Stage 4: Finished – proposal is finalised and incorporated into the standard.

The whole process from Stage 0 to Stage 4 typically takes 1–3 years, but can be longer.

Stage 2.7 is not an official TC39 stage; it is an informal internal marker used to indicate intermediate draft versions (e.g., 2.0, 2.1, 2.7) before moving to Stage 3.

ECMA also runs other meetings such as ECMAScript Working Groups, the Annual ECMAScript Summit, and version release meetings.

105th TC39 Meeting

The 105th TC39 meeting presented the following updates:

Stage 4

Intl.DurationFormat

A locale‑sensitive API for formatting durations (e.g., "1 hour, 30 minutes").

<code>new Intl.DurationFormat("fr-FR", { style: "long" }).format({
  hours: 1,
  minutes: 46,
  seconds: 40,
});
// => "1 heure, 46 minutes et 40 secondes"
</code>

Stage 3

Error.isError

Adds a static isError method to check whether a value is an instance of Error .

<code>Error.isError(undefined); // false
Error.isError(new Error()); // true
</code>

Stage 2.7

ESM Phase Imports

Enhances the ECMAScript module system with new import capabilities to simplify dependency declarations.

<code>import source myModule from "./my-module.js";
// `{ type: 'module' }` can be inferred because myModule is a module object
const worker = new Worker(myModule);
</code>

P.S.: Note that this approval is conditional.

Stage 2

Immutable ArrayBuffer

Introduces an immutable ArrayBuffer concept to prevent modification of binary data after creation.

<code>Object.freeze(new Uint8Array(buf.transferToImmutable()));
</code>

Intl Currency Display Choices

Extends currency formatting options, allowing control over symbol and code styles.

<code>const formal = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "formalSymbol",
});
formal.format(42); // "US$42.00"

const never = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "never",
});
never.format(42); // "42.00"
</code>

Stage 1

Import Sync

Provides a clear synchronous import function for ES modules, based on the Defer Import Eval proposal.

<code>let react;
try {
  react = import.sync('react');
} catch {}
if (react) {
  // If available, bind to the React framework
}
</code>
JavaScriptECMAScriptStandardizationTC39Proposals
Code Mala Tang
Written by

Code Mala Tang

Read source code together, write articles together, and enjoy spicy hot pot together.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.