ECMAScript 2025 (ES16) — це річна порція практичних покращень JavaScript. TC39 затвердив специфікацію у червні 2025. Ось частини, які варто знати.
Нові методи Set
Set нарешті отримав методи для роботи з множинами, яких мав би мати з самого початку. Об'єднання, перетин, різниця і решта. Більше не треба писати їх руками.
const frontend = new Set(['React', 'Vue', 'Svelte', 'Angular']);
const popular = new Set(['React', 'Vue', 'Node.js', 'Express']);
// Перетин — спільні елементи
frontend.intersection(popular);
// Set {'React', 'Vue'}
// Об'єднання
frontend.union(popular);
// Set {'React', 'Vue', 'Svelte', 'Angular', 'Node.js', 'Express'}
// Різниця — є у frontend, немає у popular
frontend.difference(popular);
// Set {'Svelte', 'Angular'}
// Симетрична різниця
frontend.symmetricDifference(popular);
// Set {'Svelte', 'Angular', 'Node.js', 'Express'}
// Перевірки
frontend.isSubsetOf(popular); // false
frontend.isSupersetOf(popular); // false
frontend.isDisjointFrom(popular); // falseУсі повертають новий Set, не мутуючи оригінал. Код читається чистіше і поводиться передбачувано.
Import Attributes та JSON-модулі
Import Attributes (перейменовані Import Assertions) дозволяють вказати тип імпортованого модуля. Головний кейс — імпорт JSON.
// Імпорт JSON з атрибутом типу
import config from './config.json' with { type: 'json' };
console.log(config.version); // "1.0.0"
// Динамічний імпорт також підтримує атрибути
const data = await import('./data.json', {
with: { type: 'json' }
});Ключове слово with замінило старіший assert. Браузери і Node.js вже постачають новий варіант.with замінило попередній синтаксис assert. Браузери та Node.js вже підтримують новий варіант.
Promise.try
Статичний метод, що обгортає будь-яку функцію, синхронну чи асинхронну, у Promise. Зручно, коли хочеш один шлях обробки помилок для обох.
// Раніше: доводилось обгортати вручну
function fetchData(id) {
// Якщо validate() кине помилку синхронно,
// .catch() її не перехопить
return Promise.resolve().then(() => {
validate(id);
return fetch(`/api/data/${id}`);
});
}
// Тепер: Promise.try обробляє обидва випадки
function fetchData(id) {
return Promise.try(() => {
validate(id); // синхронна помилка — перехоплена
return fetch(`/api/data/${id}`); // async — теж працює
});
}RegExp.escape
Простий метод, якого бракувало роками: екранування спецсимволів у рядку, щоб його безпечно використати в регулярному виразі.
const userInput = 'price: $100 (USD)';
const escaped = RegExp.escape(userInput);
// 'price\:\ \$100\ \(USD\)'
const regex = new RegExp(escaped);
regex.test('price: $100 (USD)'); // trueБільше не треба тягнути крихітний utility з npm. Це тепер у мові.
Iterator Helpers
Ітератори нарешті отримали методи в стилі масивів: map, filter, take, drop і решту. Працюють ліниво, тому ви не будуєте проміжні масиви по дорозі.
function* naturals() {
let n = 1;
while (true) yield n++;
}
// Перші 5 парних чисел — ліниво, без масивів
const result = naturals()
.filter(n => n % 2 === 0)
.take(5)
.toArray();
console.log(result); // [2, 4, 6, 8, 10]
// Map + forEach на ітераторі Map
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
map.values()
.map(v => v * 10)
.forEach(v => console.log(v)); // 10, 20, 30Корисно, коли ви проходите велику або нескінченну послідовність і будувати масив було б марнотратством.
Підтримка у браузерах та Node.js
Більшість цих фіч вже у Chrome 126+, Firefox 127+, Safari 18+ та Node.js 22+. Set-методи й Iterator Helpers мають найширше охоплення. Import Attributes із JSON-модулями працюють у Node.js і більшості бандлерів. Promise.try і RegExp.escape з'являються у свіжих релізах рушіїв.
Висновок
ECMAScript 2025 — тихий, але корисний реліз. Set-методи, Iterator Helpers, Promise.try і RegExp.escape кожен закривають прогалину, що дратувала розробників уже давно. Усе доступне в сучасних рушіях. Варто використати.
