За несколько лет стандарты ECMAScript совершили революцию и сделали JavaScript лучше и проще в написании, а также сделали его основным действующим лицом современных веб-технологий, таких как Node.js, React, Angular js, Vue.jsи так далее.
ES2019 (также известный как ECMAScript 2019) имеет некоторые основные и второстепенные функции, которые были одобрены комитетом TC39 и станут частью спецификации ECMAScript 2019.
Вы можете проверить TC39 Github Repo, чтобы узнать больше об этом, а также вы можете проверить официальный список функций ECMAScript в списках репозиториев TC39 готовые предложения.
Основные новые функции:
- Array.prototype.{flat, flatMap} (Брайан Терлсон, Майкл Фикарра, Матиас Байненс)
- Object.fromEntries (Дэриен Мэйллет Валентайн)
Незначительные новые функции:
- String.prototype.{trimStart, trimEnd}(Себастьян Маркбоге)
- Symbol.prototype.description(Майкл Фикарра)
- Дополнительная привязка улова(Майкл Фикарра)
- Array.prototype.sort()(Матиас Байненс)
Изменения, в основном внутренние:
- Правильный формат JSON.stringfy(Ричард Гибсон)
- Расширенный набор JSON(Ричард Гибсон)
- Ревизия Function.prototype.toString(Майкл Фикарра)
Теперь взгляните на новые функции на примерах:
Array.prototype.{flat}первоначально предложенный какArray.prototype.flatten, рекурсивно сглаживает массивы до указанной глубины, которая по умолчанию равна 1
// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]
// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]
Array.prototype.{flatMap}который похож наArray.prototype.map, за исключением того, что он объединяет результат в новый массив.
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
Предложение по новому статическому методуObject.fromEntriesв ECMAScript для преобразования списка пар "ключ-значение" в объект.
obj = Object.fromEntries([['a', 0], ['b', 1]]); // { a: 0, b: 1 }
МетодtrimStart()удаляет пробелы в начале строки.
МетодtrimEnd()удаляет пробелы в конце строки.
var hello = " Hello World! " console.log(JSON.stringfy(hello.trimStart())) //"Hello World! " console.log(JSON.stringfy(hello.trimEnd())) //" Hello World!"
Symbol.prototype.description:доступное только для чтения свойство description представляет собой строку, возвращающую необязательное описание «Symbol. " объекты.
var sym = "My Symbol" var symObj = Symbol(mySymbol) console.log(symObj) //Symbol(sym) console.log(String(symObj) === `Symbol(${sym})`) //true console.log(symObj.description) //My Symbol
Необязательная привязка Catch. Разрешите разработчикам использовать try/catch без создания неиспользуемой привязки.
try {
···
} catch {
··· //no parameters needed
}
Array.prototype.sort: предыдущая реализацияV8 использовала нестабильныйалгоритм быстрой сортировки для массивов, содержащих более 10 Предметы.
Алгоритм стабильной сортировки — это когда два объекта с одинаковыми ключами появляются в отсортированном выводе в том же порядке, что и в несортированном вводе.
Но это уже не так. ES10 предлагает стабильную сортировку массива:
var vegetables= [ { name: "tomato", count: 13, }, { name: "cucumber", count: 12, }, { name: "eggplant", count: 12, }, { name: "carrot", count: 11, }, { name: "onion", count: 11, }, { name: "pepper", count: 10, }, { name: "potatoe", count: 10, } ]; // Create our own sort criteria function: let my_sort = (a, b) => a.count - b.count;// Perform stable ES10 sort: let sorted = vegetables.sort(my_sort); console.log(sorted);
Вывод в консоль(элементы отображаются в обратном порядке):
Правильный формат JSON.stringfy:Предложение по предотвращению возврата JSON.stringfy некорректных строк Unicode.
// Non-BMP characters still serialize to surrogate pairs. JSON.stringify('𝌆') // → '"𝌆"' JSON.stringify('\uD834\uDF06') // → '"𝌆"' // Unpaired surrogate code units will serialize to escape sequences. JSON.stringify('\uDF06\uD834') // → '"\\udf06\\ud834"' JSON.stringify('\uDEAD') // → '"\\udead"'
Расширенный набор JSON:ECMAScript заявляет, что JSON является подмножеством в JSON.parse, но (как было хорошо задокументировано) это неверно, поскольку строки JSON могут содержать неэкранированные символы U+2028. LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR символы, в то время как строки ECMAScript не могут.
Эти исключения усложняют спецификацию и увеличивают когнитивную нагрузку как на разработчиков, так и на пользователей, позволяя вносить незаметные ошибки. Кроме того, как меньшая, но конкретная вытекающая из этого проблема, некоторые задачи конкатенации и построения исходного кода в настоящее время требуют дополнительных шагов для преобразования действительного JSON в действительный ECMAScript перед его внедрением.
- До недавнего времени строковые литералы ECMAScript не могли содержать символы U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR (вы должны были использовать управляющую последовательность, чтобы поместить их в строку). То есть следующий исходный код выдал синтаксическую ошибку:
const sourceCode = '"\u2028"'; eval(sourceCode); // SyntaxError
- Строковые литералы JSON могут содержать следующие два символа:
const json = '"\u2028"'; JSON.parse(json); // OK
Учитывая фиксированный синтаксис JSON, было принято решение снять ограничение для строковых литералов ECMAScript. Это упрощает грамматику спецификации, поскольку вам не нужны отдельные правила для строковых литералов ECMAScript и строковых литералов JSON.
Редакция Function.prototype.toString:Function.prototype.toString() была изменена в новом предложении. В более ранних версиях ECMAScript исходный код функции можно было распечатать с помощью toString(), но имелся недостаток, заключающийся в том, что при этом удаляются все лишние пробелы и комментарии. В новом предложении он сохранен.
function /* foo comment */ hello() {}
foo.toString(); // "function hello() {}"
и теперь это:
foo.toString(); // "function /* foo comment */ foo() {}"
Начиная с V8 v7.3/Chrome 73 все эти функции ES2019 доступны по умолчанию. Наслаждаться!
Если вам понравилась эта статья, поделитесь ею и похлопайте 👏 👏. Спасибо!