В июне 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)…..