В июне 2019 года комитет TC39 опубликовал еще один набор изменений в стандарте ECMAScript, получивший соответствующее название ECMAScript 2019 (или ES2019). Эти изменения перечислены как

Массив.прототип.{flat,flatMap}

В выпуске ES2019 к массивам добавлено два новых метода.

1) .flat()
2) .flatMap()

.flat()

Этот метод используется для «выравнивания» массива.

Синтаксис: <Array>.flat(depth); //глубина по умолчанию равна 1

Пример

.flatMap()

Этот метод аналогичен первому вызову .map(), а затем сглаживанию результата с использованием метода flat().

Синтаксис: <Array>.flatMap(func);

Note: It is same as <Array>.map(func).flat(1);

Пример:

Объект.fromEntries

ES2019 представил новый статический метод Object.fromEntries, который выполняет обратную операцию Object.entries.

Он принимает список key-value пар и возвращает новый object, чьи собственные keys и соответствующие values задаются этими парами.

Пример

String.prototype.{trimStart,trimEnd}

JavaScript уже поддерживает удаление всех пробелов с обоих концов строки с помощью метода .trim(), но ES2019есть еще два метода: 'trimStart' и 'trimEnd' которыеиспользуются только для обрезки в начале или в конце строки.

Пример:

Символ.прототип.описание

Это новое ESCAScript обновление для primitive data type Symbol.

Раньше для доступа к описанию было преобразование symbol в строку.

Пример

const sym = Symbol(‘The description’);
assert.equal(String(sym), ‘Symbol(The description)’);

Но обновление ES2019 вводит геттер Symbol.prototype.descriptionдля прямого доступа к описанию. Например.

assert.equal(sym.description, 'The description');

Подробнее об этом обновлении можно узнать в официальном предложении TC39 здесь.

Опциональная привязка улова

Это обновление позволяет разработчикам использовать try/catch без создания неиспользуемой привязки.

Вы можете использовать блок catch без параметра.

Стабильный массив.prototype.sort()

Метод Array.prototype.sort() использовал нестабильный алгоритм quicksort, когда sorting массивы содержат более 10 элементов. Чтобы убедиться, что массив выровнен правильно, ECMAScript 2019 использует алгоритм Timsort (гибридная сортировка, производная от merge sort и insertion sort) для Array.prototype.sort().

Эта спецификация в настоящее время хорошо работает со всеми движками JavaScript. Однако Microsoft Edge с ChakraCore генерирует ошибку сортировки с массивом, содержащим более 512 элементов.

На приведенном ниже снимке экрана показаны результаты теста стабильности в Edge и Firefox. Как видите, Edge терпит неудачу.

Более подробное обсуждение здесь: Стабильность сортировки массива».

Изменения, в основном внутренние

Правильно сформированный JSON.stringify

Согласно RFC 8259 для JSON, если вы обмениваетесь JSON публично, вы должны кодировать его как UTF-8.

Это может быть проблемой, если вы используете JSON.stringify(), поскольку он может возвращать последовательности из UTF-16 единиц кода, которые не могут быть закодированы как UTF-8 (например, символы в диапазоне от 0xD800 до 0xDFFFF, которые классифицируются как 'surrogate')

ECMAScript 2019 возвращает escape-последовательность вместо возврата invalid Unicode string, как показано (Edge) на следующем рисунке.

Для получения более подробной информации ознакомьтесь с TC39 официальной документацией по предложению.

Надмножество JSON

JSON (стандартизованный через ECMA-404) не является подмножеством ECMAScript. Это означает, что ECMAScript string literals и JSON string literals — два разных объекта.

Строковые литералы ECMAScript не могут содержать символы U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR. Например

Строковые литералы ECMAScript

const sourceCode = '"\u2028"';
eval(sourceCode); // SyntaxError

Строковые литералы JSON

const json = '"\u2028"';
JSON.parse(json); // OK

ECMAScript 2019 убирает ограничение для ECMAScript string literals , так как вам не нужны отдельные правила для ECMAScript string literals и JSON string literals.

Ревизия Function.prototype.toString

ECMAScript 2019 содержит два важных улучшения по сравнению с ES2018:

  • По возможности — исходный код. Если функция была создана с помощью исходного кода ECMAScript, toString() должен возвращать этот исходный код. В ES2016 решение об этом остается за движками.
  • В противном случае — стандартизированный заполнитель: в ES2016, если toString() не мог (или не хотел) создать синтаксически допустимый код ECMAScript, он должен был вернуть строку, для которой eval() выдает SyntaxError. Другими словами, eval() не должен анализировать строку. Это требование было прямо несовместимым — какую бы строку вы ни придумали, вы никогда не можете быть полностью уверены, что будущая версия ECMAScript не сделает ее синтаксически допустимой. Напротив, предложение стандартизирует заполнитель: функцию, тело которой { [native code] }. Подробности объясняются в следующем разделе.

Пример

Function.prototype.toString() теперь возвращает точные фрагменты текста исходного кода, включая пробелы и комментарии. Вот пример сравнения старого и нового поведения:

Подробнее о заказе см. в разделе предложение TC39.

Прежде чем попрощаться…

Большое спасибо за то, что нашли свое драгоценное время, чтобы прочитать этот пост.

Связаться со мной @LinkedIn

Предыдущий пост:
Новые функции ECMAScript ES7 и ES8 — JavaScript
Новые функции ECMAScript 2018 (ES2018 или ES9) — JavaScript

Следите за обновлениями ES11 (ES2020)…..