We’ve written posts for CSS, but it’s high time JavaScript received the same attention! JavaScript has its own versioning system, which is quite efficient. This overview will cover the language’s new features, along with crucial aspects like runtimes, frameworks, libraries, and tools, vital for any JavaScript developer. Now, let’s dive in!
### What’s New in the Language
JavaScript boasts yearly version updates, a commendable approach if you ask me!
#### ECMAScript 2025
The latest release is **ECMAScript 2025**, launched in June 2025. You can access [the complete specification here](https://tc39.es/ecma262/2025/).
##### Iterator Helpers
New methods such as `.map()`, `.filter()`, `.take()`, and `.drop()` are available on iterators with lazy evaluation. While mapping over arrays already exists, these new iterator methods, though esoteric for frontend folks, prioritize performance.
“`javascript
const result = array
.map(x => x * 2)
.filter(x => x > 10)
.slice(0, 3);
“`
This approach can be slow and memory-intensive, especially with large arrays performing expensive operations. The new way:
“`javascript
const result = Iterator.from(array)
.map(x => x * 2)
.filter(x => x > 10)
.take(3)
.toArray();
“`
`Iterator.from()` works on any iterable, not just arrays but also sets, maps, generators, etc.
##### Set Methods
Sets in JavaScript are like arrays but ensure unique items. New methods help identify overlapping items, differences, and more between two sets:
“`javascript
const youKnow = new Set([“JS”, “Python”, “CSS”, “SQL”]);
const jobNeeds = new Set([“JS”, “TypeScript”, “Python”]);
youKnow.intersection(jobNeeds);
youKnow.union(jobNeeds);
jobNeeds.difference(youKnow);
youKnow.difference(jobNeeds);
youKnow.symmetricDifference(jobNeeds);
jobNeeds.isSubsetOf(youKnow);
youKnow.isSupersetOf(jobNeeds);
youKnow.isDisjointFrom(jobNeeds);
“`
Pretty helpful, isn’t it? Claude Code created [an interactive demo](https://codepen.io/editor/chriscoyier/pen/019c9733-c5ed-7594-9bd9-8ed47f3860d1?file=%2Findex.html&orientation=left&show=preview) for this.
##### RegEx Updates
Imagine building an on-page search where users input their search terms. Implementing this as a RegEx search could be risky since some characters may have special meanings in RegEx. A new method `RegExp.escape()` has been introduced after 15 years to tackle this:
“`javascript
const query = userInput;
const badRe = new RegExp(query, “g”);
const goodRe = new RegExp(RegExp.escape(query), “g”);
“`
Claude Code also [demonstrated this effectively](https://codepen.io/editor/chriscoyier/pen/019cbeea-b5e2-7af0-acbe-96dab95e0ee8).
There’s an update in using “flags” inside a RegEx. Typically, the “i” flag makes an entire RegEx case-insensitive. But you can now make specific parts case-insensitive by enclosing them in parentheses and adding flags like this:
“`javascript
/[a-z]+@[A-Z]+/i
/(?i:[a-z.]+)@(?-i:[A-Z]+).(?i:com|org)/
“`
##### Promise Update
The popular asynchronous model (Promises) introduces `Promise.try()`, simplifying error management. This enables handling sync or async errors together:
“`javascript
function loadUser(id) {
if (!id) throw new Error(“No ID”);
return fetch(`/api/users/${id}`);
}
let p;
try {
p = loadUser(id);
} catch (e) { handleError(e); }
p?.catch(e => handleError(e));
Promise.try(() => loadUser(id))
.then(user => render(user))
.catch(err => showError(err));
“`
And once again, this was [demonstrated by Claude Code](https://codepen.io/editor/chriscoyier/pen/019cc8dc-9bde-7597-9b57-d91d6ef0a6c2).
##### Import Attributes
Import attributes are delightful. Now, you can import JSON directly instead of fetching and parsing it:
“`javascript
import data from “./file.json” with { type: ‘json’ }
“`
This method comes with caveats, such as being non-garbage-collectible. For safe
