SkillAgentSearch skills...

Es10

JavaScript ES10 review

Install / Use

/learn @KasperGreen/Es10
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Стандартизация JS перешла на годичный цикл обновлений, а начало года — отличное время для того чтобы узнать, что нас ждёт в юбилейной — уже десятой редакции EcmaScript!

ES9 - актуальная версия спецификации.

ES10 — всё ещё черновик.

На сегодняшний день в Stage 4<sup> #</sup> — всего несколько предложений.

А в Stage 3<sup> #</sup> — целая дюжина!

Из них, на мой взгляд, самые интересные — приватные поля классов<sup> #</sup>, шебанг грамматика для скриптов<sup> #</sup>, числа произвольной точности<sup> #</sup>, доступ к глобальному контексту<sup> #</sup> и динамические импорты<sup> #</sup>.

  КДПВ: Жёлтый магнит с надписью «JS ES10» на экране монитора —  от kasper.green & elfafeya.art         <sup><cite>Автор фото: kasper.green; Жёлтый магнит: elfafeya.art & kasper.green</cite></sup>

<cut />

Содержание

Пять стадий<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>

<spoiler title="исходный код"> ```javascript function isValidJSON(text) { try { JSON.parse(text); return true; } catch { // без аргумента return false; } } ``` </spoiler>

   

Доступ к описанию символьной ссылки

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

View on GitHub
GitHub Stars4
CategoryDevelopment
Updated5y ago
Forks1

Languages

JavaScript

Security Score

55/100

Audited on Nov 10, 2020

No findings