Free lesson · JavaScript Basic to Advance
Birth of ECMAScript
What Is ECMAScript, and Why Should You Care?
You're going to see the word "ECMAScript" everywhere as a JavaScript developer. In blog posts. In documentation. In job descriptions. People will say "ES6 added arrow functions" or "this is an ES2020 feature" and the abbreviations will pile up. Before you read another tutorial, you need to know what ECMAScript actually is and why JavaScript has two names.
The short version: JavaScript is an implementation of a standard called ECMAScript. When people say "ES6" or "ES2020," they're referring to versions of that standard. Understanding this relationship is what lets you read modern JavaScript documentation without getting lost.
Why Standards Became Necessary
Interactive animation: Netscape's JavaScript beside Microsoft's reverse-engineered JScript - nearly identical, and different enough to cause subtle bugs.
When Netscape shipped JavaScript in 1995, they had a monopoly on web browsers — for about a year. Then Microsoft entered the browser market with Internet Explorer and needed their own JavaScript. They couldn't just use Netscape's code, so they reverse-engineered the language and called their version JScript.
JScript and JavaScript looked nearly identical on the surface. They were close enough that the same code often ran in both browsers. But they weren't identical. Subtle differences in behavior caused subtle bugs. A function that worked perfectly in Netscape might silently misbehave in Internet Explorer, or vice versa. Developers had to write code defensively, with browser-specific workarounds scattered throughout their projects.
This was the chaos of the late 1990s. The web was exploding in popularity, two browsers dominated the market, and they each had their own slightly-different version of JavaScript. Something had to give.
I came to JavaScript in 2018, more than twenty years after this happened. The chaos was long over by then. But when I first encountered the word "ECMAScript" in a tutorial, nobody explained where it came from. I assumed it was some technical term I didn't need to understand. It took me months to realize that ECMAScript is the reason JavaScript even works the same way across different browsers today.
The Standardization Story
Interactive animation: In 1996 Netscape hands the language to Ecma, and a Sun trademark means the standard is named ECMAScript.
In 1996, Netscape submitted JavaScript to Ecma International — a Swiss standards organization that publishes specifications for technologies. The goal was to create a single, neutral standard that any browser vendor could implement.
There was one problem. "JavaScript" was a trademark owned by Sun Microsystems (the company behind Java). Ecma couldn't call their standard JavaScript. So they named the standard ECMAScript — an awkward name nobody loved, but a legally available one.
This is why the language has two names:
- JavaScript is what Netscape (and now everyone else) calls their implementation
- ECMAScript is the formal specification that implementations follow
Today, when you write code that runs in Chrome, you're running V8 — Google's JavaScript engine that implements ECMAScript. When your code runs in Firefox, you're running SpiderMonkey — Mozilla's engine that also implements ECMAScript. Same specification, different implementations, consistent behavior.
graph TD
A[ECMAScript Specification] --> B[V8<br/>Chrome, Node.js]
A --> C[SpiderMonkey<br/>Firefox]
A --> D[JavaScriptCore<br/>Safari]
A --> E[ChakraCore<br/>Legacy Edge]
style A fill:#7c3aed,color:#fff
This diagram shows the relationship between the ECMAScript specification and the JavaScript engines that implement it. ECMAScript is a single specification published by Ecma International. Multiple engines implement that specification: V8 powers Chrome and Node.js, SpiderMonkey powers Firefox, JavaScriptCore powers Safari, and ChakraCore powered the legacy version of Microsoft Edge. All of them follow the same specification, which is why your JavaScript code runs consistently across browsers.
The Version History You Actually Need to Know
ECMAScript has had many versions since 1997. Most of them don't matter for day-to-day development. A few are inflection points you need to recognize.
- ES3 (1999) — The version that defined JavaScript for almost a decade. If you ever see truly ancient JavaScript code, this is what it was written against.
- ES4 (abandoned, 2008) — The version that almost was. It was ambitious, it tried to add too much at once, and the committee couldn't agree. ES4 was dropped entirely. This is why there's a gap in the version numbering.
- ES5 (2009) — The version that quietly became the workhorse. Added
strict mode, JSON support, array methods likeforEach,map, andfilter. For years, "JavaScript" effectively meant ES5. - ES6 / ES2015 — The turning point. The version that made JavaScript feel modern. Added
letandconst, arrow functions, classes, modules, template literals, destructuring, Promises, and more. If you're learning JavaScript today, you're learning ES6+ JavaScript. - ES2016, ES2017, ES2018, ES2019, ES2020, and onward — Annual releases. Each one adds a smaller set of features. ES2017 added
async/await. ES2020 added optional chaining and nullish coalescing. ES2022 added top-levelawait.
The shift from "name your version" (ES3, ES5, ES6) to "name your year" (ES2015, ES2016, etc.) happened deliberately. After ES6 / ES2015, the committee committed to annual releases — small, predictable updates instead of giant overhauls.
When someone says "ES6 feature," they mean ES2015. The two names refer to the same version. ES6 is more common in casual conversation; ES2015 is more common in formal documentation.
Here's the same simple task written before and after ES6, to make the gap concrete:
// Pre-ES6 style (you might see this in older codebases)
var users = ["Olena", "Nikhil", "Emeka"];
var greetings = users.map(function(name) {
return "Hello, " + name;
});
console.log(greetings);
// Modern ES6+ style (what you'll write today)
const usersModern = ["Olena", "Nikhil", "Emeka"];
const greetingsModern = usersModern.map((name) => `Hello, ${name}`);
console.log(greetingsModern);
Both code samples produce identical output. The second is shorter, easier to read, and uses const instead of var, arrow functions instead of function expressions, and template literals instead of string concatenation. Every one of those improvements arrived in ES6.
When I started learning JavaScript in 2018, most tutorials still used the pre-ES6 style. I learned var before let. I learned function expressions before arrow functions. It took me months to realize I had been learning an outdated dialect of a language that had already moved on. Be careful which tutorials you follow — anything older than 2016 is probably pre-ES6.
How JavaScript Evolves: The TC39 Process
Annual releases don't happen by accident. There's a committee called TC39 (Technical Committee 39) that governs the language. They meet regularly. They take proposals for new features. Each proposal moves through five stages before it becomes part of the standard.
- Stage 0 — Strawperson: An informal idea. Anyone can propose one. Most don't go anywhere.
- Stage 1 — Proposal: A formal proposal with a written description. Now under serious consideration.
- Stage 2 — Draft: A specification draft exists. The feature is likely to ship, but details may change.
- Stage 3 — Candidate: The specification is essentially finalized. Implementations begin shipping.
- Stage 4 — Finished: The feature is included in the next ECMAScript release.
Why does this matter for you? Because when you read a blog post that says "this is a Stage 2 proposal," you now know not to rely on it in production code. Stage 2 means "the committee is interested but the details might change." Stage 4 is the only stage where the feature is guaranteed.
Note: Some proposals spend years in Stage 3 before being finished. The Pipeline Operator proposal — a way to chain function calls more cleanly — has been in flux for years. Don't be surprised when a feature you've heard about hasn't actually landed yet.
Why This Matters in Interviews
Interview: Interviewers sometimes ask "what's the difference between ES5 and ES6?" or "when was
async/awaitintroduced?" These aren't deep technical questions. They're checking that you haven't been stuck learning an outdated dialect of the language.A confident answer would be: "ES6, also known as ES2015, was the major modernization release. It added
letandconst, arrow functions, classes, modules, Promises, and destructuring. After ES6, the committee moved to annual releases.async/awaitcame in ES2017, optional chaining in ES2020." You don't need to memorize every release — knowing the shape of the timeline is enough.If they follow up with "how do new features get added to JavaScript?", you can mention the TC39 process and the five stages. That signals you understand how the language actually evolves, not just what it currently does.
Try It
Exercise: Pick any JavaScript file in a project you've worked on — or open a popular open-source JavaScript library on GitHub. Look at the first 50 lines of code and count the post-ES6 features you can identify:
letorconst(instead ofvar)- Arrow functions (instead of
functionexpressions)- Destructuring (like
const { name, age } = user)- Template literals (backticks instead of string concatenation)
- Spread operator (
...)- Optional chaining (
?.)- Nullish coalescing (
??)The number you find tells you how modern the codebase is. A codebase with zero of these features was either written before 2015 or hasn't been updated since. A codebase using all of them is using modern JavaScript well. Most real codebases sit somewhere in between, and you'll need to be comfortable with both styles.