ES6 - деструктуризация

Поговорим о ECMAScript 2015

Предыдущий



Деструктуризация - еще одно небольшое дополнение к готовящемуся к выпуску стандарту JavaScript, которое помогает нам писать код более гибко и эффективно.

Это позволяет связывать с использованием сопоставления с образцом. Мы можем использовать его для сопоставления массивов и объектов. Он похож на поиск стандартных объектов и возвращает undefined, если значение не найдено.

массивы

Сегодня часто можно увидеть такой код.

// ES5
var point = [1, 2];
var xVal = point[0],
    yVal = point[1];
 
console.log(xVal); // 1
console.log(yVal); // 2

ES6 дает нам деструктуризацию массивов на отдельные переменные во время присваивания, что является интуитивно понятным и гибким.

// ES6
let point = [1, 2];
let [xVal, yVal] = point;
 
console.log(xVal); // 1
console.log(yVal); // 2
// .. and reverse!
[xVal, yVal] = [yVal, xVal];
 
console.log(xVal); // 2
console.log(yVal); // 1

Мы даже можем опустить некоторые значения ..

let threeD = [1, 2, 3];
let [a, , c] = threeD;
console.log(a); // 1
console.log(c); // 3

..и имеют деструктуризацию вложенных массивов.

let nested = [1, [2, 3], 4];
let [a, [b], d] = nested;
console.log(a); // 1
console.log(b); // 2
console.log(d); // 4

объекты

Помимо синтаксиса массива, ES6 также может деструктурировать объекты. Он использует литерал объекта в левой части операции присваивания. Шаблон объекта очень похож на шаблон массива, показанный выше. Давайте посмотрим:

let point = {
  x: 1,
  y: 2
};
let { x: a, y: b } = point;
console.log(a); // 1
console.log(b); // 2

Он поддерживает вложенный объект, а также шаблон массива.

let point = {
  x: 1,
  y: 2,
  z: {
    one: 3,
    two: 4
  }
};
let { x: a, y: b, z: { one: c, two: d } } = point;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(d); // 4

смешанный

Мы также можем смешивать объекты и массивы вместе и использовать их литералы.

let mixed = {
  one: 1,
  two: 2,
  values: [3, 4, 5]
};
let { one: a, two: b, values: [c, , e] } = mixed;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(e); // 5

Но я думаю, что наиболее интересным является то, что мы можем использовать функции, которые возвращают деструктурирующее присваивание.

function mixed () {
  return {
    one: 1,
    two: 2,
    values: [3, 4, 5]
  };
}
let { one: a, two: b, values: [c, , e] } = mixed();
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
console.log(e); // 5

Тот же результат! Это дает нам много возможностей использовать его в нашем коде.

внимание!

Если значение деструктурирующего присваивания не совпадает, оно оценивается как неопределенное.

let point = {
  x: 1
};
let { x: a, y: b } = point;
console.log(a); // 1
console.log(b); // undefined

Если мы попытаемся опустить var, let или const, будет выдана ошибка, поскольку код блока не может деструктурировать присваивание.

let point = {
  x: 1
};
{ x: a } = point; // throws error

Мы должны заключить это в круглые скобки. Просто это ☺

let point = {
  x: 1
};
({ x: a } = point);
console.log(a); // 1

Следующий



Нравится? Рекомендую!



Вся серия также доступна в виде электронной книги. Я опубликовал это на Leanpub.com



Будущее светлое!