ECMAScript 2025: Что нового

25 июня 2025 года 129-я Генеральная ассамблея Ecma утвердила спецификацию языка ECMAScript 2025, а это значит, что теперь он официально стал стандартом.

Импорт атрибутов и модулей JSON

Атрибуты импорта обеспечивают синтаксическую основу для импорта артефактов, не относящихся к JavaScript. Первыми поддерживаемыми артефактами такого рода являются модули JSON:

// Статический импорт
import configData1 from './config-data.json' with { type: 'json' };

// Динамический импорт
const configData2 = await import(
'./config-data.json', { with: { type: 'json' } }
);

Синтаксис объектного литерала после with используется для указания атрибутов импорта. type является атрибутом импорта.

Вспомогательные методы итератора

Вспомогательные методы итератора позволяют расширить возможности итераторов:

const arr = ['a', '', 'b', '', 'c', '', 'd', '', 'e'];
assert.deepEqual(
arr.values() // creates an iterator
.filter(x => x.length > 0)
.drop(1)
.take(3)
.map(x => `=${x}=`)
.toArray()
,
['=b=', '=c=', '=d=']
);

Некоторые вспомогательные методы итератора работают так же, как методы массива с такими же именами:

Остальные вспомогательные методы итераторов являются уникальными для итераторов:

Чем методы итератора лучше методов массивов

Новые методы Set

Добавлено несколько новых методов Set:

Примеры:

assert.deepEqual(
new Set(['a', 'b', 'c']).union(new Set(['b', 'c', 'd'])),
new Set(['a', 'b', 'c', 'd'])
);
assert.deepEqual(
new Set(['a', 'b', 'c']).intersection(new Set(['b', 'c', 'd'])),
new Set(['b', 'c'])
);
assert.deepEqual(
new Set(['a', 'b']).isSubsetOf(new Set(['a', 'b', 'c'])),
true
);
assert.deepEqual(
new Set(['a', 'b', 'c']).isSupersetOf(new Set(['a', 'b'])),
true
);

RegExp.escape()

RegExp.escape() экранирует текст, чтобы его можно было использовать внутри регулярного выражения — например, следующий код удаляет все вхождения текста внутри str, не заключённые в кавычки:

function removeUnquotedText(str, text) {
const regExp = new RegExp(
`(?<!“)${RegExp.escape(text)}(?!”)`,
'gu'
);
return str.replaceAll(regExp, '•');
}
assert.equal(
removeUnquotedText('“yes” and yes and “yes”', 'yes'),
'“yes” and • and “yes”'
);

Модификаторы шаблонов регулярных выражений (инлайн флаги)

Модификаторы шаблонов регулярных выражений (инлайн флаги) позволяют применять флаги к частям регулярного выражения (а не ко всему регулярному выражению) — например, в следующем регулярном выражении флаг i применяется только к "HELLO":

> /^x(?i:HELLO)x$/.test('xHELLOx')
true
> /^x(?i:HELLO)x$/.test('xhellox')
true
> /^x(?i:HELLO)x$/.test('XhelloX')
false

Дублирующиеся именованные группы захвата

Дублирующиеся имена групп захвата: теперь можно использовать одно и то же имя группы дважды, если оно появляется в разных альтернативах:

const RE = /(?<chars>a+)|(?<chars>b+)/v;
assert.deepEqual(
RE.exec('aaa').groups,
{
chars: 'aaa',
__proto__: null,
}
);
assert.deepEqual(
RE.exec('bb').groups,
{
chars: 'bb',
__proto__: null,
}
);

Promise.try()

Promise.try() позволяет запустить цепочку Promise с кодом, который не является чисто асинхронным, например:

function computeAsync() {
return Promise.try(() => {
const value = syncFuncMightThrow();
return asyncFunc(value);
});
}

Поддержка 16-битных чисел с плавающей запятой (float16)

Данная поддержка предоставляет следующие функции:

Комментарии


Дополнительные материалы

Предыдущая Статья

Всё, что появится в PHP 8.5