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=']
);
Некоторые вспомогательные методы итератора работают так же, как методы массива с такими же именами:
- Методы, возвращающие итераторы:
iterator.filter(filterFn)
iterator.map(mapFn)
iterator.flatMap(mapFn)
- Методы, возвращающие логические значения:
iterator.some(fn)
iterator.every(fn)
- Методы, возвращающие другие значения:
iterator.find(fn)
iterator.reduce(reducer, initialValue?)
- Методы, не возвращающие значения:
iterator.forEach(fn)
Остальные вспомогательные методы итераторов являются уникальными для итераторов:
iterator.drop(limit)
Возвращает итератор без первыхlimit
элементов итератора.iterator.take(limit)
Возвращает итератор с первымиlimit
элементами итератора.iterator.toArray()
Собирает все оставшиеся элементы итератора в массив и возвращает его.
Чем методы итератора лучше методов массивов
- Методы итератора можно использовать с любой итерабельной структурой данных — например, они позволяют фильтровать и сопоставлять структуры данных
Set
иMap
. - Методы итератора не создают промежуточных массивов и вычисляют данные постепенно. Это удобно при работе с большими объёмами данных:
- При использовании методов итератора все методы применяются сначала к первому значению, затем ко второму и т. д.
- При использовании методов массива первый метод применяется ко всем значениям, затем второй метод применяется ко всем результатам и т. д.
Новые методы Set
Добавлено несколько новых методов Set
:
- Объединение наборов:
Set.prototype.intersection(other)
Set.prototype.union(other)
Set.prototype.difference(other)
Set.prototype.symmetricDifference(other)
- Проверка отношений между наборами:
Set.prototype.isSubsetOf(other)
Set.prototype.isSupersetOf(other)
Set.prototype.isDisjointFrom(other)
Примеры:
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
)
Данная поддержка предоставляет следующие функции:
Math.f16round()
- Новый тип элемента для Typed Arrays API:
Float16Array
DataView.prototype.getFloat16()
DataView.prototype.setFloat16()