ECMAScript proposal updates 2024-10Пришел октябрьский апдейт по пропозалам в EcmaScript.
В 4 стейдж перешли Promise.try, Import Attributes, RegExp Modifiers, Sync Iterator helpers, JSON Modules
Promise.try
Позволяет завернуть колбек в промис
До Promise.try
await new Promise((resolve) => resolve(fn()))
С Promise.try
await Promise.try(fn)
Import Attributes
Позволяет указать мета-информацию для импортов
import json from "./foo.json" with { type: "json" };
import("foo.json", { with: { type: "json" } });
RegExp Modifiers
Модификаторы RegExp (например
i
,
m
и другие) теперь можно использовать и в под-выражениях
Пример из доки (внимание на группы, внутри которых используется i)
const re1 = /^[a-z](?-i:[a-z])$/i;
re1.test("ab"); // true
re1.test("Ab"); // true
re1.test("aB"); // false
const re2 = /^(?i:[a-z])[a-z]$/;
re2.test("ab"); // true
re2.test("Ab"); // true
re2.test("aB"); // false
Sync Iterator helper
Добавляет удобные методы (
map
,
filter
,
take
,
flatMap
,
reduce
,
toArray
,
forEach
,
some
,
every
,
find
,
from
) для работы с итераторами
Пример
function* naturals() {
let i = 0;
while (true) {
yield i;
i += 1;
}
}
const result = naturals()
.take(5)
.reduce((sum, value) => {
return sum + value;
}, 3);
result // 13
В stage-3 перешел
Atomics.pause
. Этот метод позволяет указать, что треду следует встать на короткую паузу. Это позволяет более оптимально использовать CPU
В stage-2.7 перешли:
Error.isError
и
Iterator Sequencing
Error.isError
решает ту же проблему что и
Array.isArray
, а именно создание инстансов Ошибки в разных контекстах (например, iframe имеет полностью свой контекст и там свой класс Error, поэтому проверка ошибки на
instanceof Error
в родительском контексте выведет false т.к. в родительском контексте есть свой класс Error)
Iterator Sequencing
добавляет API для объединения итераторов.
Например, у вас есть 2 итератора и вы между ними еще хотите добавить значений. Сейчас самый удобный способ сделать это
let lows = Iterator.from([0, 1, 2, 3]);
let highs = Iterator.from([6, 7, 8, 9]);
let digits = function* () {
yield* lows;
yield 4;
yield 5;
yield* highs;
}();
Array.from(digits); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
А будет
let lows = Iterator.from([0, 1, 2, 3]);
let highs = Iterator.from([6, 7, 8, 9]);
let digits = Iterator.concat(lows, [4, 5], highs);
В stage-2 пришли
Extractors
,
structs
,
iterator chunking
Extractors
- это расширение деструктуризации, которое позволяет сразу обработать деструктурированное значение.
Проще всего показать на примере
Сейчас приходится делать так:
const { field: rawField } = data
const field = process(rawField)
Пропозал позволяет сделать так
const processData({ field }) = data
Ну и пример того как сделать простую деструктуризацию в этом пропозале
class C {
#data;
constructor(data) {
this.#data = data;
}
[Symbol.customMatcher](subject) {
return #data in subject && [this.#data];
}
}
const subject = new C({ x: 1, y: 2 });
const C({ x, y }) = subject;
x; // 1
y; // 2
structs
добавляет структуры в язык. Это более строгая версия классов. Эта штука нужна для повышения производительности (в том числе для кейсов с воркерами)
struct Box {
constructor(x) { this.x = x; }
x;
}
let box = new Box(0);
box.x = 42; // x is declared
assertThrows(() => { box.y = 8.8; }); // structs are sealed
assertThrows(() => { box.__proto__ = {}; }); // structs are sealed
iterator chunking
- мега простой пропозал, позволяет нарезать итератор на куски
const digits = () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].values();
let chunksOf2 = Array.from(digits().chunks(2));
// [ [0, 1], [2, 3], [4, 5], [6, 7], [8, 9] ]
https://ecmascript-daily.github.io/ecmascript/2024/10/12/ecmascript-proposal-update
#development #javascript #ecmascript #proposal