Es10
JavaScript ES10 review
Install / Use
/learn @KasperGreen/Es10README
Стандартизация JS перешла на годичный цикл обновлений, а начало года — отличное время для того чтобы узнать, что нас ждёт в юбилейной — уже десятой редакции EcmaScript!
ES9 - актуальная версия спецификации.
ES10 — всё ещё черновик.
На сегодняшний день в Stage 4<sup> #</sup> — всего несколько предложений.
А в Stage 3<sup> #</sup> — целая дюжина!
Из них, на мой взгляд, самые интересные — приватные поля классов<sup> #</sup>, шебанг грамматика для скриптов<sup> #</sup>, числа произвольной точности<sup> #</sup>, доступ к глобальному контексту<sup> #</sup> и динамические импорты<sup> #</sup>.
<sup><cite>Автор фото: kasper.green; Жёлтый магнит: elfafeya.art & kasper.green</cite></sup>
Содержание
Пять стадий<sup> #</sup>
Stage 4 — Final<sup> #</sup>
• catch — аргумент стал необязательным<sup> #</sup>;
• Symbol().description — акцессор к описанию символа<sup> #</sup>;
• 'строки EcmaScript' — улучшенная совместимость с JSON форматом<sup> #</sup>;
• .toString() — прототипный метод обновлён<sup> #</sup>.
• Object.fromEntries() — создание объекта из массива пар — ключ\значение<sup> #</sup>;
• .flat() и .flatMap() — прототипные методы массивов<sup> #</sup>.
Stage 3 — Pre-release<sup> #</sup>
• # — приватное всё у классов, через октоторп<sup> #</sup>;
• #!/usr/bin/env node — шебанг грамматика для скриптов<sup> #</sup>;
• BigInt() — новый примитив, для чисел произвольной точности<sup> #</sup>;
• globalThis — новый способ доступа к глобальному контексту<sup> #</sup>;
• import(dynamic) — динамический импорт<sup> #</sup>;
• import.meta — мета-информация о загружаемом модуле<sup> #</sup>;
• JSON.stringify() — фикс метода<sup> #</sup>;
• RegExp — устаревшие возможности<sup> #</sup>;
• .trimStart() и .trimEnd() — прототипные методы строк<sup> #</sup>;
• .matchAll() — .match() с глобальным флагом<sup> #</sup>;
Итоги<sup> #</sup>
Пять стадий
<sub>Stage</sub> 0 ↓ Strawman <sup>Наметка</sup> Идея, которую можно реализовать через Babel-плагин.;
<sub>Stage</sub> 1 ↓ Proposal <sup>Предложение</sup> Проверка жизнеспособности идеи.;
<sub>Stage</sub> 2 ↓ Draft <sup>Черновик</sup> Начало разработки спецификации.;
<sub>Stage</sub> 3 ↓ Candidate <sup>Кандидат</sup> Предварительная версия спецификации.;
<sub>Stage</sub> 4 ֍ Finished <sup>Завершён</sup> Финальная версия спецификации на этот год.
Мы рассмотрим только Stage 4 — де-факто, вошедший в стандарт.
И Stage 3 — который вот-вот станет его частью.
֍ Stage 4
Эти изменения уже вошли в стандарт.
Необязательный аргумент у catch
https://github.com/tc39/proposal-optional-catch-binding
До ES10 блок catch требовал обязательного аргумента для сбора информации об ошибке, даже если она не используется:
function isValidJSON(text) {
try {
JSON.parse(text);
return true;
} catch(unusedVariable) { // переменная не используется
return false;
}
}
<sup>Edge пока не обновлён до ES10, и ожидаемо валится с ошибкой</sup>
Начиная с редакции ES10, круглые скобки можно опустить и catch станет как две капли воды похож на try.
<sup>Мой Chrome уже обновился до ES10, а местами и до Stage 3. Дальше скриншоты будут из Chrome</sup>
Доступ к описанию символьной ссылки
https://tc39.github.io/proposal-Symbol-description/
Описание символьной ссылки можно косвенно получить методом toString():
const symbol_link = Symbol("Symbol description")
String(symbol_link) // "Symbol(Symbol description)"
Начиная с ES10 у символов появилось свойство description, доступное только для чтения. Оно позволяет без всяких танцев с бубном получить описание символа:
symbol_link.description
// "Symbol description"
В случае если описание не задано, вернётся — undefined:
const without_description_symbol_link = Symbol()
without_description_symbol_link.description
// undefined
const empty_description_symbol_link = Symbol('')
empty_description_symbol_link.description
// ""
Строки EcmaScript совместимые с JSON
https://github.com/tc39/proposal-json-superset
EcmaScript до десятой редакции утверждает, что JSON является подмножеством JSON.parse, но это неверно.
JSON строки могут содержать неэкранированные символы разделителей линий U+2028 <sup> LINE SEPARATOR</sup> и абзацев U+2029<sup> PARAGRAPH SEPARATOR</sup>.
Строки ECMAScript до десятой версии — нет.
Если в Edge вызвать eval() со строкой "\u2029",
он ведёт себя так, словно мы сделали перенос строки — прямо посреди кода:

C ES10 строками — всё в порядке:

Доработка прототипного метода .toString()
http://tc39.github.io/Function-prototype-toString-revision/
<spoiler title="Цели изменений"> * убрать обратно несовместимое требование:Если реализация не может создать строку исходного кода, соответствующую этим критериям, она должна вернуть строку, для которой eval будет выброшено исключение с ошибкой синтаксиса.
-
уточнить «функционально эквивалентное» требование;
-
стандартизировать строковое представление встроенных функций и хост-объектов;
-
уточнить требования к представлению на основе «фактических характеристик» объекта;
-
убедиться, что синтаксический анализ строки содержит то же тело функции и список параметров, что и оригинал;
-
для функций, определенных с использованием кода ECMAScript, toString должен возвращать фрагмент исходного текста от начала первого токена до конца последнего токена, соответствующего соответствующей грамматической конструкции;
-
для встроенных функциональных объектов toStringне должны возвращать ничего, кроме NativeFunction;
-
для вызываемых объектов, которые не были определены с использованием кода ECMAScript, toString необходимо вернуть NativeFunction;
-
для функций, создаваемых динамически (конструкторы функции или генератора) toString, должен синтезировать исходный текст;
-
для всех других объектов, toString должен бросить TypeError исключение.
</spoiler>
// Пользовательская функция
function () { console.log('My Function!'); }.toString();
// function () { console.log('My Function!'); }
// Метод встроенного объекта объект
Number.parseInt.toString();
// function parseInt() { [native code] }
// Функция с привязкой контекста
function () { }.bind(0).toString();
// function () { [native code] }
// Встроенные вызываемые функциональный объекты
Symbol.toString();
// function Symbol() { [native code] }
// Динамически создаваемый функциональный объект
Function().toString();
// function anonymous() {}
// Динамически создаваемый функциональный объект-генератор
function* () { }.toString();
// function* () { }
// .call теперь обязательно ждёт, в качестве аргумента, функцию
Function.prototype.toString.call({});
// Function.prototype.toString requires that 'this' be a Function"
Создание объекта методом Object.fromEntries()
https://github.com/tc39/proposal-object-from-entries
<sup>работает в Chrome</sup>
Аналог _.fromPairs из lodash:
Object.fromEntries([['key_1', 1], ['key_2', 2]])
// {key_1:
Related Skills
node-connect
347.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
108.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
