Существует стандартная процедура для последних версий Javascript и за этим стоит целый комитет. В статье я расскажу о том, кто принимает решения по любой новой спецификации, какова процедура для нее и что нового в ES2019.
Спецификация языка, управляющая JavaScript, называется ECMAScript. Существует группа под названием технический комитет 39 [TC39], которая рассматривает каждую спецификацию перед принятием.
Каждое изменение проходит поэтапно:
Функция, которая достигает 4-го этапа, скорее всего, будет частью спецификации языка.
Рассмотрим, что добавлено в спецификацию в соответствии с ES2019.
Array.prototype.flat() позволяет рекурсивно сгладить массивы до заданной глубины и вернуть новый массив.
Синтаксис: Array.prototype.flat(depth)
глубина — значение по умолчанию 1, используйте Infinity, чтобы сгладить все вложенные массивы.
Array.prototype.flatMap () отображает каждый элемент с помощью функции отображения и выравнивает результат в новый массив. Это идентично операции map, за которой следует flat глубиной 1.
Синтаксис: Array.prototype.flatMap(callback)
callback: функция, которая производит элемент нового массива.
Object.fromEntries выполняет обратное Object.entries. Он преобразует список пар ключ-значение в объект.
Синтаксис: Object.fromEntries(iterable)
итерация: Итерация как Array или Map объекты, реализующие итерируемый протокол.
trimStart() удаляет пробелы в начале строки, а trimEnd() удаляет пробелы в конце строки.
До новой спецификации требовалось иметь привязку переменной исключения к оператору catch. ES2019 сделал его необязательным.
Эта функция полезна, если вы хотите полностью игнорировать ошибку. Лучшая практика — рассмотреть обработку ошибки.
Есть случаи, когда вы знаете возможную ошибку, которая может сработать при выполнении операций. И вы можете игнорировать обработку catch.
Символы разделителя строк (U + 2028) и разделителя абзацев (U + 2029) теперь разрешены в строковых литералах. Ранее они рассматривались как терминаторы строки и приводили к исключениям SyntaxError.
Вместо непарных суррогатных кодовых точек, приводящих к единым кодовым единицам UTF-16, ES10 представляет их с помощью escape-последовательностей JSON.
.toString() теперь возвращает точные фрагменты текста исходного кода, включая пробелы и комментарии.
Свойство только для чтения, которое возвращает необязательное описание объекта Symbol:
Есть еще много других интересных вещей таких, как статические и приватные методы и поля в классах, Legacy RegEx и т.д. Разработчику важно следить за появлением новых технологий, улучшением старых и использовать это в работе.
Будет полезно почитать предыдущие версии: ES2015 ES2016 ES2017 ES2018
Спецификация языка, управляющая JavaScript, называется ECMAScript. Существует группа под названием технический комитет 39 [TC39], которая рассматривает каждую спецификацию перед принятием.
Каждое изменение проходит поэтапно:
- Этап 0: Идеи
- Этап 1: Предложения
- Этап 2: Черновики
- Этап 3: Кандидаты
- Этап 4: Завершение/Утверждение
Функция, которая достигает 4-го этапа, скорее всего, будет частью спецификации языка.
Рассмотрим, что добавлено в спецификацию в соответствии с ES2019.
Array.prototype.{flat,flatMap}
Array.prototype.flat() позволяет рекурсивно сгладить массивы до заданной глубины и вернуть новый массив.
Синтаксис: Array.prototype.flat(depth)
глубина — значение по умолчанию 1, используйте Infinity, чтобы сгладить все вложенные массивы.
const numbers = [1, 2, [3, 4, [5, 6]]];
// Considers default depth of 1
numbers.flat();
> [1, 2, 3, 4, [5, 6]]
// With depth of 2
numbers.flat(2);
> [1, 2, 3, 4, 5, 6]
// Executes two flat operations
numbers.flat().flat();
> [1, 2, 3, 4, 5, 6]
// Flattens recursively until the array contains no nested arrays
numbers.flat(Infinity)
> [1, 2, 3, 4, 5, 6]
Array.prototype.flatMap () отображает каждый элемент с помощью функции отображения и выравнивает результат в новый массив. Это идентично операции map, за которой следует flat глубиной 1.
Синтаксис: Array.prototype.flatMap(callback)
callback: функция, которая производит элемент нового массива.
const numbers = [1, 2, 3];
numbers.map(x => [x * 2]);
> [[2], [4], [6]]
numbers.flatMap(x => [x * 2]);
> [2, 4, 6]
Object.fromEntries
Object.fromEntries выполняет обратное Object.entries. Он преобразует список пар ключ-значение в объект.
Синтаксис: Object.fromEntries(iterable)
итерация: Итерация как Array или Map объекты, реализующие итерируемый протокол.
const records = [['name','Mathew'], ['age', 32]];
const obj = Object.fromEntries(records);
> { name: 'Mathew', age: 32}
Object.entries(obj);
> [['name','Mathew'], ['age', 32]];
String.prototype.{trimStart, trimEnd}
trimStart() удаляет пробелы в начале строки, а trimEnd() удаляет пробелы в конце строки.
const greeting = ` Hello Javascript! `;
greeting.length;
> 19
greeting = greeting.trimStart();
> 'Hello Javascript! '
greeting.length;
> 18
greeting = 'Hello World! ';
greeting.length;
> 15
greeting = greeting.trimEnd();
> 'Hello World!'
greeting.length;
> 12
Optional Catch Binding
До новой спецификации требовалось иметь привязку переменной исключения к оператору catch. ES2019 сделал его необязательным.
// Before
try {
...
} catch(error) {
...
}
// After
try {
...
} catch {
...
}
Эта функция полезна, если вы хотите полностью игнорировать ошибку. Лучшая практика — рассмотреть обработку ошибки.
Есть случаи, когда вы знаете возможную ошибку, которая может сработать при выполнении операций. И вы можете игнорировать обработку catch.
JSON ? ECMAScript
Символы разделителя строк (U + 2028) и разделителя абзацев (U + 2029) теперь разрешены в строковых литералах. Ранее они рассматривались как терминаторы строки и приводили к исключениям SyntaxError.
// Produces invalid string before ES2019
eval('"\u2028"');
// Valid in ES2019
eval('"\u2028"');
Хорошо сформированный JSON.stringify
Вместо непарных суррогатных кодовых точек, приводящих к единым кодовым единицам UTF-16, ES10 представляет их с помощью escape-последовательностей JSON.
JSON.stringify('\uD800');
> '"?"'
JSON.stringify('\uD800');
> '"\\ud800"'
Function.prototype.toString
.toString() теперь возвращает точные фрагменты текста исходного кода, включая пробелы и комментарии.
function /* a comment */ foo () {}
// Previously:
foo.toString();
> 'function foo() {}'
^ no comment
^ no space
// Now:
foo.toString();
> 'function /* comment */ foo () {}'
Symbol.prototype.description
Свойство только для чтения, которое возвращает необязательное описание объекта Symbol:
Symbol('desc').toString();
> "Symbol(desc)"
Symbol('desc').description;
> "desc"
Symbol('').description;
> ""
Symbol().description;
> undefined
Заключение
Есть еще много других интересных вещей таких, как статические и приватные методы и поля в классах, Legacy RegEx и т.д. Разработчику важно следить за появлением новых технологий, улучшением старых и использовать это в работе.
Будет полезно почитать предыдущие версии: ES2015 ES2016 ES2017 ES2018
vitaliy2
Так стоит отметить, зачем ввелись именования trimStart и trimEnd — потому что в письмах справа налево человеку будет не очень понятно, почему trimLeft удаляет символы справа, а не слева. Поэтому теперь мы говорим, что символы удаляются с начала строки (где бы это начало не находилось).
PS. trimLeft не является стандартом.
PS. Этот коммент был для тех, кто не может запомнить, как правильно, trimStart или trimLeft.