Что нового в JavaScript ES2019

https://medium.freecodecamp.org/whats-new-in-javascript-es2019-8af4390d8494
Существует стандартная процедура для последних версий Javascript и за этим стоит целый комитет. В статье я расскажу о том, кто принимает решения по любой новой спецификации, какова процедура для нее и что нового в ES2019.

image

Спецификация языка, управляющая 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
  • +10
  • 5,4k
  • 1
Поделиться публикацией

Похожие публикации

Комментарии 1

    +2
    Так стоит отметить, зачем ввелись именования trimStart и trimEnd — потому что в письмах справа налево человеку будет не очень понятно, почему trimLeft удаляет символы справа, а не слева. Поэтому теперь мы говорим, что символы удаляются с начала строки (где бы это начало не находилось).

    PS. trimLeft не является стандартом.
    PS. Этот коммент был для тех, кто не может запомнить, как правильно, trimStart или trimLeft.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое