Деструктивное присваивание
Синтаксис деструктивного присваивания в выражениях JavaScript позволяет извлекать данные из массивов или объектов при помощи синтаксиса, подобного объявлению массива или литералов в объекте.Говоря простыми словами - это синтаксис, который облегчает извлечение данных из массивов и объектов.
Все материалы по ES6
Первое, что мы сделаем, это запустим скрипт Babel, который будет следить за файлами и при их изменении создавать свежие версии.
Откроем папку проекта в командной строке (КС). Вводим команду:
npm run watch
И нажать Enter
В папке src создадим файл destructor.js и сразу укажу его в файле index.html
<script src="src/destructor.js"></script>
Последние версии браузеров поддерживают синтаксис деструктивного присваивания без ранспиляции.
Деструктивное присваивание массивов
Создадим массив. Для извлечения данных из этого массива в ES5:var cats = ['cat1', 'cat2', 'cat3','cat4']; var cat_1 = cats[0]; var cat_2 = cats[1]; var cat_3 = cats[2]; var cat_4 = cats[3]; console.log(cat_1, cat_2, cat_3, cat_4);
В ES6 это можно сделать проще.
let cat_1, cat_2, cat_3, cat_4; //объявили переменные [ cat_1, cat_2, cat_3, cat_4 ] = cats; //присвоили им значения console.log(cat_1, cat_2, cat_3, cat_4);
Мы получим тот же результат - вывод в консоли всех значений массива.
Еще немного упростим:
let [ cat_1, cat_2, cat_3, cat_4 ] = cats; console.log(cat_1, cat_2, cat_3, cat_4);
Массив можно объявить сразу в выражении:
let [ cat_1, cat_2, cat_3, cat_4 ] = ['cat1', 'cat2', 'cat3','cat4']; console.log(cat_1, cat_2, cat_3, cat_4);
Если посмотреть на то, что сделал Babel, то можно увидеть, что он просто создал переменные и присвоил им значения.
Файл dist/destructor.js
'use strict'; // var cat_1 = cats[0]; // var cat_2 = cats[1]; // var cat_3 = cats[2]; // var cat_4 = cats[3]; var cat_1 = 'cat1', cat_2 = 'cat2', cat_3 = 'cat3', cat_4 = 'cat4'; console.log(cat_1, cat_2, cat_3, cat_4);
Квадратные скобки при объявлении переменных говорит о том. что мы будем использовать деструктивное присваивание. В качестве значения мы присваиваем им массив или переменную, содержащую массив.
Далее, благодаря деструктивному присваиванию значения массива копируются в созданные нами переменные.
Таким образом мы получаем переменные со значениями массива.
Если переменных больше, чем значений массива.
Если переменных больше, чем значений массива, то значение переменной будет не определено -undefined
.
let items = [11, 55, 99]; let [ low, mid, height, best ] = items; console.log( low, mid, height, best );
В консоли мы увидим:
Есть возможность игнорировать значения. Для этого мы не указываем переменную, но оставляем запятую.
Например так:
let items = [11, 55, 99]; let [ low,, best ] = items; console.log( low, best );
В консоли получим
11
и 99
.
В массиве больше значений, чем переменных.
Для последней переменной можно использовать синтаксис оставшихся параметров - три точки...
.
В этом случае переменная будет принимать массив.
let items = [11, 55, 99]; let [ low,...rest] = items; console.log( rest );
В консоли мы увидим, что в переменной rest содержится массив.
Мы можем использовать значение по умолчанию.
В массиве меньше значений, чем переменных.
let items = [11, 55]; let [ low, mid, height = 0 ] = items; console.log( low, mid, height );
В консоли
11
, 55
и 0
.
Вложенный массаив.
Деструктивное присваивание можно использовать и в тех случаях, когда массив содержит в себе другой массив.let items = [11, 55, [ 2, 4] ]; let [ low, mid, height ] = items; console.log( height );
Значением переменной height будет массив:
Для того, чтобы вытащить значения из вложенного массива, мы еще раз используем квадратные скобки.
let items = [11, 55, [ 2, 4] ]; let [ low, mid, [ two, four ] ] = items; console.log( low, mid, two, four );
Как параметр функции.
Деструктивное присваивание мы можем использовать как параметр функции.Создадим простую функцию и вызовем ее. В качестве аргументов передадим массив. Для того, чтобы вытащить значения из массива, мы можем использовать деструктивное присваивание.
function compute ( [ tree, five ] ) { console.log("tree = " + tree); console.log("five = " + five) } compute([3, 5]);
Как и ожидалось, в консоли мы получим :
Возврат значений функцией.
Деструктивное присваивание мы можем использовать для возврата значений из функций.Допустим у нас есть функция, которая возвращает массив из трех значений.
Далее объявим переменную в которую пометим вызов этой функции.
function getNumbers () { return [ 33, 44, 77]; } let numbers = getNumbers (); console.log( numbers );
Как можно предположить, мы получим в консоли массив из трех элементов:
Теперь, используя деструктивное присваивание мы можем объявить переменные и присвоить им значения возвращенного массива.
Для этого в качестве значения мы присвоим результат вызова нашей функции.
function getNumbers () {
return [ 33, 44, 77];
}
let numbers = getNumbers ();
console.log( numbers );
let [t_tree, f_four, s_seven] = getNumbers();
console.log( t_tree, f_four, s_seven );
Быстрый обмен значениям переменных.
Деструктивное присваивание используется для быстрого обмена значений переменных.Проще всего это увидеть на примере:
let yes = 'yes'; let no = 'no'; [ yes, no ] = [ no, yes]; console.log("yes = " + yes); console.log("no = " + no);
В консоли мы увидим:
Если поcмотреть на то, что сделал Babel dist/destructor.js
'use strict'; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); // let items = [11, 55, [ 2, 4] ]; // let [ low, mid, [ two, four ] ] = items; // console.log( low, mid, two, four ); // function compute ( [ tree, five ]) { // console.log("tree = " + tree); // console.log("five = " + five) // } // compute([3, 5]); function getNumbers() { return [33, 44, 77]; } var numbers = getNumbers(); console.log(numbers); var _getNumbers = getNumbers(), _getNumbers2 = _slicedToArray(_getNumbers, 3), t_tree = _getNumbers2[0], f_four = _getNumbers2[1], s_seven = _getNumbers2[2]; console.log(t_tree, f_four, s_seven); var yes = 'yes'; var no = 'no'; var _ref = [no, yes]; yes = _ref[0]; no = _ref[1]; console.log("yes = " + yes); console.log("no = " + no);
По сути, если разобраться то, он делает все тоже самое. что мы бы написали сами в ES5.
Комментариев нет:
Отправить комментарий