ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ (destructuring assignment) â ÑÑо оÑобÑй ÑинÑакÑÐ¸Ñ Ð¿ÑиÑваиваниÑ, пÑи коÑоÑом можно пÑиÑвоиÑÑ Ð¼Ð°ÑÑив или обÑÐµÐºÑ ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑким пеÑеменнÑм, Ñазбив его на ÑаÑÑи.
ÐаÑÑив
ÐÑÐ¸Ð¼ÐµÑ Ð´ÐµÑÑÑÑкÑÑÑизаÑии маÑÑива:
'use strict';
let [firstName, lastName] = ["ÐлÑÑ", "ÐанÑоÑ"];
alert(firstName); // ÐлÑÑ
alert(lastName); // ÐанÑоÑ
ÐÑи Ñаком пÑиÑвоении пеÑвое знаÑение маÑÑива пойдÑÑ Ð² пеÑеменнÑÑ firstName, вÑоÑое â в lastName, а поÑледÑÑÑие (еÑли еÑÑÑ) â бÑдÑÑ Ð¾ÑбÑоÑенÑ.
ÐенÑжнÑе ÑлеменÑÑ Ð¼Ð°ÑÑива Ñакже можно оÑбÑоÑиÑÑ, поÑÑавив лиÑнÑÑ Ð·Ð°Ð¿ÑÑÑÑ:
'use strict';
// пеÑвÑй и вÑоÑой ÑлеменÑÑ Ð½Ðµ нÑжнÑ
let [, , title] = "Юлий ЦезаÑÑ ÐмпеÑаÑÐ¾Ñ Ð Ð¸Ð¼Ð°".split(" ");
alert(title); // ÐмпеÑаÑоÑ
Ркоде вÑÑе пеÑвÑй и вÑоÑой ÑлеменÑÑ Ð¼Ð°ÑÑива никÑда не запиÑалиÑÑ, они бÑли оÑбÑоÑенÑ. Ðак, впÑоÑем, и вÑе ÑлеменÑÑ Ð¿Ð¾Ñле ÑÑеÑÑего.
ÐпеÑаÑÐ¾Ñ Â«spread»
ÐÑли Ð¼Ñ Ñ
оÑим полÑÑиÑÑ Ð¸ поÑледÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива, но не ÑвеÑÐµÐ½Ñ Ð² иÑ
ÑиÑле â можно добавиÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ паÑамеÑÑ, коÑоÑÑй полÑÑÐ¸Ñ Â«Ð²ÑÑ Ð¾ÑÑалÑное», пÑи помоÑи опеÑаÑоÑа "..." («spread», ÑÑоеÑоÑие):
'use strict';
let [firstName, lastName, ...rest] = "Юлий ЦезаÑÑ ÐмпеÑаÑÐ¾Ñ Ð Ð¸Ð¼Ð°".split(" ");
alert(firstName); // Юлий
alert(lastName); // ЦезаÑÑ
alert(rest); // ÐмпеÑаÑоÑ,Рима (маÑÑив из 2Ñ
ÑлеменÑов)
ÐнаÑением rest бÑÐ´ÐµÑ Ð¼Ð°ÑÑив из оÑÑавÑиÑ
ÑÑ ÑлеменÑов маÑÑива. ÐмеÑÑо rest можно иÑполÑзоваÑÑ Ð¸ дÑÑгое Ð¸Ð¼Ñ Ð¿ÐµÑеменной, опеÑаÑÐ¾Ñ Ð·Ð´ÐµÑÑ â ÑÑоеÑоÑие. Ðно должно ÑÑоÑÑÑ ÑолÑко поÑледним ÑлеменÑом в ÑпиÑке Ñлева.
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
ÐÑли знаÑений в маÑÑиве менÑÑе, Ñем пеÑеменнÑÑ
â оÑибки не бÑдеÑ, пÑоÑÑо пÑиÑвоиÑÑÑ undefined:
'use strict';
let [firstName, lastName] = [];
alert(firstName); // undefined
ÐпÑоÑем, как пÑавило, в ÑакиÑ
ÑлÑÑаÑÑ
задаÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ. ÐÐ»Ñ ÑÑого нÑжно поÑле пеÑеменной иÑполÑзоваÑÑ Ñимвол = Ñо знаÑением, напÑимеÑ:
'use strict';
// знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
let [firstName="ÐоÑÑÑ", lastName="ÐнонимнÑй"] = [];
alert(firstName); // ÐоÑÑÑ
alert(lastName); // ÐнонимнÑй
РкаÑеÑÑве знаÑений по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð½Ðµ ÑолÑко пÑимиÑивÑ, но и вÑÑажениÑ, даже вклÑÑаÑÑие в ÑÐµÐ±Ñ Ð²ÑÐ·Ð¾Ð²Ñ ÑÑнкÑий:
'use strict';
function defaultLastName() {
return Date.now() + '-visitor';
}
// lastName полÑÑÐ¸Ñ Ð·Ð½Ð°Ñение, ÑооÑвеÑÑÑвÑÑÑее ÑекÑÑей даÑе:
let [firstName, lastName=defaultLastName()] = ["ÐаÑÑ"];
alert(firstName); // ÐаÑÑ
alert(lastName); // 1436...-visitor
ÐамеÑим, ÑÑо вÑзов ÑÑнкÑии defaultLastName() Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑÑÑеÑÑвлÑн ÑолÑко пÑи необÑ
одимоÑÑи, Ñо еÑÑÑ ÐµÑли знаÑÐµÐ½Ð¸Ñ Ð½ÐµÑ Ð² маÑÑиве.
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¾Ð±ÑекÑа
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð¸ Ñ Ð¾Ð±ÑекÑами. ÐÑи ÑÑом Ð¼Ñ ÑказÑваем, какие ÑвойÑÑва в какие пеÑеменнÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Â«Ð¸Ð´Ñи».
ÐазовÑй ÑинÑакÑиÑ:
let {var1, var2} = {var1: â¦, var2: â¦};
ÐбÑÐµÐºÑ ÑпÑава â Ñже ÑÑÑеÑÑвÑÑÑий, коÑоÑÑй Ð¼Ñ Ñ Ð¾Ñим ÑазбиÑÑ Ð½Ð° пеÑеменнÑе. Ð Ñлева â ÑпиÑок пеÑеменнÑÑ , в коÑоÑÑе нÑжно ÑооÑвеÑÑÑвÑÑÑие ÑвойÑÑва запиÑаÑÑ.
ÐапÑимеÑ:
'use strict';
let options = {
title: "ÐенÑ",
width: 100,
height: 200
};
let {title, width, height} = options;
alert(title); // ÐенÑ
alert(width); // 100
alert(height); // 200
Ðак видно, ÑвойÑÑва options.title, options.width и options.height авÑомаÑиÑеÑки пÑиÑвоилиÑÑ ÑооÑвеÑÑÑвÑÑÑим пеÑеменнÑм.
ÐÑли Ñ
оÑеÑÑÑ Ð¿ÑиÑвоиÑÑ ÑвойÑÑво обÑекÑа в пеÑеменнÑÑ Ñ Ð´ÑÑгим именем, напÑимеÑ, ÑÑÐ¾Ð±Ñ ÑвойÑÑво options.width поÑло в пеÑеменнÑÑ w, Ñо можно ÑказаÑÑ ÑооÑвеÑÑÑвие ÑеÑез двоеÑоÑие, Ð²Ð¾Ñ Ñак:
'use strict';
let options = {
title: "ÐенÑ",
width: 100,
height: 200
};
let {width: w, height: h, title} = options;
alert(title); // ÐенÑ
alert(w); // 100
alert(h); // 200
РпÑимеÑе вÑÑе ÑвойÑÑво width оÑпÑавилоÑÑ Ð² пеÑеменнÑÑ w, ÑвойÑÑво height â в пеÑеменнÑÑ h, а title â в пеÑеменнÑÑ Ñ Ñем же названием.
ÐÑли какиÑ
-Ñо ÑвойÑÑв в обÑекÑе неÑ, можно ÑказаÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ ÑеÑез знак ÑавенÑÑва =, Ð²Ð¾Ñ Ñак;
'use strict';
let options = {
title: "ÐенÑ"
};
let {width=100, height=200, title} = options;
alert(title); // ÐенÑ
alert(width); // 100
alert(height); // 200
Ðожно и ÑоÑеÑаÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно двоеÑоÑие и ÑавенÑÑво:
'use strict';
let options = {
title: "ÐенÑ"
};
let {width:w=100, height:h=200, title} = options;
alert(title); // ÐенÑ
alert(w); // 100
alert(h); // 200
Ð ÑÑо, еÑли в обÑекÑе болÑÑе знаÑений, Ñем пеÑеменнÑÑ ? Ðожно ли кÑда-Ñо пÑиÑвоиÑÑ Â«Ð¾ÑÑаÑок», аналогиÑно маÑÑивам?
Такой возможноÑÑи в ÑекÑÑем ÑÑандаÑÑе неÑ. Ðна планиÑÑеÑÑÑ Ð² бÑдÑÑем ÑÑандаÑÑе, и вÑглÑдеÑÑ Ð¾Ð½Ð° бÑÐ´ÐµÑ Ð¿ÑимеÑно Ñак:
'use strict';
let options = {
title: "ÐенÑ",
width: 100,
height: 200
};
let {title, ...size} = options;
// title = "ÐенÑ"
// size = { width: 100, height: 200} (оÑÑаÑок)
ÐÑÐ¾Ñ ÐºÐ¾Ð´ бÑÐ´ÐµÑ ÑабоÑаÑÑ, напÑимеÑ, пÑи иÑполÑзовании Babel Ñо вклÑÑÑннÑми ÑкÑпеÑименÑалÑнÑми возможноÑÑÑми, но еÑÑ Ñаз замеÑим, ÑÑо в ÑекÑÑий ÑÑандаÑÑ ÑÐ°ÐºÐ°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð½Ðµ воÑла.
РпÑимеÑаÑ
вÑÑе пеÑеменнÑе обÑÑвлÑлиÑÑ Ð¿ÑÑмо пеÑед пÑиÑваиванием: let {â¦} = {â¦}. ÐонеÑно, можно и без let, иÑполÑзоваÑÑ Ñже ÑÑÑеÑÑвÑÑÑие пеÑеменнÑе.
Ðднако, здеÑÑ ÐµÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑой «подвоÑ
». Ð JavaScript, еÑли в оÑновном поÑоке кода (не внÑÑÑи дÑÑгого вÑÑажениÑ) вÑÑÑеÑаеÑÑÑ {...}, Ñо ÑÑо воÑпÑинимаеÑÑÑ ÐºÐ°Ðº блок.
ÐапÑимеÑ, можно иÑполÑзоваÑÑ Ñакой блок Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи пеÑеменнÑÑ :
'use strict';
{
// вÑпомогаÑелÑнÑе пеÑеменнÑе, локалÑнÑе Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ°
let a = 5;
// поÑабоÑали Ñ Ð½Ð¸Ð¼Ð¸
alert(a); // 5
// болÑÑе ÑÑи пеÑеменнÑе не нÑжнÑ
}
alert(a); // оÑибка Ð½ÐµÑ Ñакой пеÑеменной
ÐонеÑно, ÑÑо бÑÐ²Ð°ÐµÑ Ñдобно, но в данном ÑлÑÑае ÑÑо ÑоздаÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¿Ñи деÑÑÑÑкÑÑÑизаÑии:
let a, b;
{a, b} = {a:5, b:6}; // бÑÐ´ÐµÑ Ð¾Ñибка, оно поÑÑиÑаеÑ, ÑÑо {a,b} - блок
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¸Ð½ÑеÑпÑеÑаÑии {a, b} как блока, нÑжно обеÑнÑÑÑ Ð²ÑÑ Ð¿ÑиÑваивание в Ñкобки:
let a, b;
({a, b} = {a:5, b:6}); // внÑÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑо Ñже не блок
ÐложеннÑе деÑÑÑÑкÑÑÑизаÑии
ÐÑли обÑÐµÐºÑ Ð¸Ð»Ð¸ маÑÑив ÑодеÑÐ¶Ð°Ñ Ð´ÑÑгие обÑекÑÑ Ð¸Ð»Ð¸ маÑÑивÑ, и Ð¸Ñ Ñоже Ñ Ð¾ÑеÑÑÑ ÑазбиÑÑ Ð½Ð° пеÑеменнÑе â не пÑоблема.
ÐеÑÑÑÑкÑÑÑизаÑии можно как Ñгодно ÑоÑеÑаÑÑ Ð¸ вкладÑваÑÑ Ð´ÑÑг в дÑÑга.
Ркоде ниже options ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±ÑÐµÐºÑ Ð¸ подмаÑÑив. РдеÑÑÑÑкÑÑÑизаÑии ниже ÑоÑ
ÑанÑеÑÑÑ Ñа же ÑÑÑÑкÑÑÑа:
'use strict';
let options = {
size: {
width: 100,
height: 200
},
items: ["ÐонÑик", "ÐиÑожное"]
}
let { title="ÐенÑ", size: {width, height}, items: [item1, item2] } = options;
// ÐÐµÐ½Ñ 100 200 ÐонÑик ÐиÑожное
alert(title); // ÐенÑ
alert(width); // 100
alert(height); // 200
alert(item1); // ÐонÑик
alert(item2); // ÐиÑожное
Ðак видно, веÑÑ Ð¾Ð±ÑÐµÐºÑ options коÑÑекÑно ÑÐ°Ð·Ð±Ð¸Ñ Ð½Ð° пеÑеменнÑе.
ÐÑого
-
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑазбиваÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð»Ð¸ маÑÑив на пеÑеменнÑе пÑи пÑиÑвоении.
-
СинÑакÑиÑ:
let {prop : varName = default, ...} = objectÐдеÑÑ Ð´Ð²Ð¾ÐµÑоÑие
:задаÑÑ Ð¾ÑобÑажение ÑвойÑÑваpropв пеÑеменнÑÑvarName, а ÑавенÑÑво=defaultзадаÑÑ Ð²ÑÑажение, коÑоÑое бÑÐ´ÐµÑ Ð¸ÑполÑзовано, еÑли знаÑение оÑÑÑÑÑÑвÑÐµÑ (не Ñказано илиundefined).ÐÐ»Ñ Ð¼Ð°ÑÑивов Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение поÑÑдок, поÑÑÐ¾Ð¼Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¸ÑполÑзоваÑÑ
:, но знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â можно:let [var1 = default, var2, ...rest] = arrayÐбÑÑвление пеÑеменной в наÑале конÑÑÑÑкÑии не обÑзаÑелÑно. Ðожно иÑполÑзоваÑÑ Ð¸ ÑÑÑеÑÑвÑÑÑие пеÑеменнÑе. Ðднако пÑи деÑÑÑÑкÑÑÑизаÑии обÑекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¾Ð±ÐµÑнÑÑÑ Ð²ÑÑажение в Ñкобки.
-
ÐложеннÑе обÑекÑÑ Ð¸ маÑÑÐ¸Ð²Ñ Ñоже ÑабоÑаÑÑ, пÑи деÑÑÑÑкÑÑÑизаÑии нÑжно лиÑÑ ÑÐ¾Ñ ÑаниÑÑ ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ, ÑÑо и иÑÑ Ð¾Ð´Ð½Ñй обÑекÑ/маÑÑив.
Ðак Ð¼Ñ Ñвидим далее, деÑÑÑÑкÑÑÑизаÑии оÑобенно ÑÐ´Ð¾Ð±Ð½Ñ Ð¿Ñи ÑÑении обÑекÑнÑÑ Ð¿Ð°ÑамеÑÑов ÑÑнкÑий.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)