Ð JavaScript еÑÑÑ Ð´Ð²Ðµ ÑаÑе вÑего иÑполÑзÑемÑе ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
â ÑÑо Object и Array.
- ÐбÑекÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð½Ð°Ð¼ ÑоздаваÑÑ Ð¾Ð´Ð½Ñ ÑÑÑноÑÑÑ, коÑоÑÐ°Ñ Ñ ÑÐ°Ð½Ð¸Ñ ÑлеменÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ клÑÑам.
- ÐаÑÑÐ¸Ð²Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð½Ð°Ð¼ ÑобиÑаÑÑ ÑлеменÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑпоÑÑдоÑеннÑй ÑпиÑок.
Ðо когда Ð¼Ñ Ð¿ÐµÑедаÑм Ð¸Ñ Ð² ÑÑнкÑиÑ, Ñо ей Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð½Ðµ обÑекÑ/маÑÑив Ñеликом, а ÑлеменÑÑ Ð¿Ð¾ оÑделÑноÑÑи.
ÐеÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание â ÑÑо ÑпеÑиалÑнÑй ÑинÑакÑиÑ, коÑоÑÑй позволÑÐµÑ Ð½Ð°Ð¼ «ÑаÑпаковаÑÑ» маÑÑÐ¸Ð²Ñ Ð¸Ð»Ð¸ обÑекÑÑ Ð² неÑколÑко пеÑеменнÑÑ , Ñак как иногда они более ÑдобнÑ.
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ñакже пÑекÑаÑно ÑабоÑÐ°ÐµÑ Ñо ÑложнÑми ÑÑнкÑиÑми, коÑоÑÑе имеÑÑ Ð¼Ð½Ð¾Ð³Ð¾ паÑамеÑÑов, знаÑений по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ Ñак далее. СкоÑо Ð¼Ñ Ñвидим ÑÑо.
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¼Ð°ÑÑива
ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð´ÐµÑÑÑÑкÑÑÑизаÑии маÑÑива на пеÑеменнÑе:
// Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼Ð°ÑÑив Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ и Ñамилией
let arr = ["Ilya", "Kantor"];
// деÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание
// запиÑÑÐ²Ð°ÐµÑ firstName = arr[0]
// и surname = arr[1]
let [firstName, surname] = arr;
alert(firstName); // Ilya
alert(surname); // Kantor
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¿ÐµÑеменнÑе вмеÑÑо ÑлеменÑов маÑÑива.
ÐÑлиÑно ÑмоÑÑиÑÑÑ Ð² ÑоÑеÑании Ñо split или дÑÑгими меÑодами, возвÑаÑаÑÑими маÑÑив:
let [firstName, surname] = "Ilya Kantor".split(' ');
alert(firstName); // Ilya
alert(surname); // Kantor
Ðак Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ, ÑинÑакÑÐ¸Ñ Ð¿ÑоÑÑ. Ðднако еÑÑÑ Ð½ÐµÑколÑко ÑÑÑаннÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñов. ÐавайÑе поÑмоÑÑим болÑÑе пÑимеÑов, ÑÑÐ¾Ð±Ñ Ð»ÑÑÑе понÑÑÑ ÑÑо.
«ÐеÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание» не ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð¼Ð°ÑÑив. Ðно вообÑе ниÑего не Ð´ÐµÐ»Ð°ÐµÑ Ñ Ð¿Ñавой ÑаÑÑÑÑ Ð¿ÑиÑваиваниÑ, его задаÑа â ÑолÑко ÑкопиÑоваÑÑ Ð½ÑжнÑе знаÑÐµÐ½Ð¸Ñ Ð² пеÑеменнÑе.
ÐÑо пÑоÑÑо коÑоÑкий ваÑÐ¸Ð°Ð½Ñ Ð·Ð°Ð¿Ð¸Ñи:
// let [firstName, surname] = arr;
let firstName = arr[0];
let surname = arr[1];
ÐежелаÑелÑнÑе ÑлеменÑÑ Ð¼Ð°ÑÑива Ñакже могÑÑ Ð±ÑÑÑ Ð¾ÑбÑоÑÐµÐ½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной запÑÑой:
// вÑоÑой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ðµ нÑжен
let [firstName, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
alert( title ); // Consul
РпÑимеÑе вÑÑе вÑоÑой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива пÑопÑÑкаеÑÑÑ, а ÑÑеÑий пÑиÑваиваеÑÑÑ Ð¿ÐµÑеменной title, оÑÑавÑиеÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива Ñакже пÑопÑÑкаÑÑÑÑ (Ñак как Ð´Ð»Ñ Ð½Ð¸Ñ
Ð½ÐµÑ Ð¿ÐµÑеменнÑÑ
).
â¦Ðа Ñамом деле Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð»Ñбой пеÑебиÑаемÑй обÑекÑ, не ÑолÑко маÑÑивÑ:
let [a, b, c] = "abc";
let [one, two, three] = new Set([1, 2, 3]);
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑо Ñгодно «пÑиÑваиваÑÑее» Ñ Ð»ÐµÐ²Ð¾Ð¹ ÑÑоÑонÑ.
ÐапÑимеÑ, можно пÑиÑвоиÑÑ ÑвойÑÑÐ²Ñ Ð¾Ð±ÑекÑа:
let user = {};
[user.name, user.surname] = "Ilya Kantor".split(' ');
alert(user.name); // Ilya
alert(user.surname); // Kantor
РпÑедÑдÑÑей главе Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ меÑод Object.entries(obj).
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐµÐ³Ð¾ Ñ Ð´ÐµÑÑÑÑкÑÑÑизаÑией Ð´Ð»Ñ ÑиклиÑного пеÑебоÑа клÑÑей и знаÑений обÑекÑа:
let user = {
name: "John",
age: 30
};
// Ñикл по клÑÑам и знаÑениÑм
for (let [key, value] of Object.entries(user)) {
alert(`${key}:${value}`); // name:John, заÑем age:30
}
â¦Ñо же Ñамое Ð´Ð»Ñ map:
let user = new Map();
user.set("name", "John");
user.set("age", "30");
// Map пеÑебиÑÐ°ÐµÑ ÐºÐ°Ðº паÑÑ [клÑÑ, знаÑение], ÑÑо оÑÐµÐ½Ñ Ñдобно Ð´Ð»Ñ Ð´ÐµÑÑÑÑкÑÑÑиÑованиÑ
for (let [key, value] of user) {
alert(`${key}:${value}`); // name:John, заÑем age:30
}
СÑÑеÑÑвÑÐµÑ Ñ Ð¾ÑоÑо извеÑÑнÑй ÑÑÑк Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° знаÑений двÑÑ Ð¿ÐµÑеменнÑÑ Ñ Ð¸ÑполÑзованием деÑÑÑÑкÑÑÑиÑÑÑÑего пÑиÑваиваниÑ:
let guest = "Jane";
let admin = "Pete";
// ÐавайÑе поменÑем меÑÑами знаÑениÑ: Ñделаем guest = "Pete", а admin = "Jane"
[guest, admin] = [admin, guest];
alert(`${guest} ${admin}`); // Pete Jane (ÑÑпеÑно заменено!)
ÐдеÑÑ Ð¼Ñ ÑоздаÑм вÑеменнÑй маÑÑив из двÑÑ Ð¿ÐµÑеменнÑÑ Ð¸ немедленно деÑÑÑÑкÑÑÑиÑÑем его в поÑÑдке заменÑ.
Таким обÑазом, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ поменÑÑÑ Ð¼ÐµÑÑами даже более двÑÑ Ð¿ÐµÑеменнÑÑ .
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Â«â¦Â»
ÐбÑÑно, еÑли маÑÑив длиннее, Ñем ÑпиÑок Ñлева, «лиÑние» ÑлеменÑÑ Ð¾Ð¿ÑÑкаÑÑÑÑ.
ÐапÑимеÑ, здеÑÑ Ð±ÐµÑÑÑÑÑ ÑолÑко пеÑвÑе два ÑлеменÑа, а оÑÑалÑнÑе пÑоÑÑо игноÑиÑÑÑÑÑÑ:
let [name1, name2] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
alert(name1); // Julius
alert(name2); // Caesar
// ÐалÑнейÑие ÑлеменÑÑ Ð½Ð¸Ð³Ð´Ðµ не пÑиÑваиваÑÑÑÑ
ÐÑли Ð¼Ñ Ñ
оÑим не пÑоÑÑо полÑÑиÑÑ Ð¿ÐµÑвÑе знаÑениÑ, но и ÑобÑаÑÑ Ð²Ñе оÑÑалÑнÑе, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ паÑамеÑÑ, коÑоÑÑй полÑÑÐ°ÐµÑ Ð¾ÑÑалÑнÑе знаÑениÑ, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Â«Ð¾ÑÑаÑоÑнÑе паÑамеÑÑÑ» â ÑÑоеÑоÑие ("..."):
let [name1, name2, ...rest] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
// rest ÑÑо маÑÑив ÑлеменÑов, наÑÐ¸Ð½Ð°Ñ Ñ 3-го
alert(rest[0]); // Consul
alert(rest[1]); // of the Roman Republic
alert(rest.length); // 2
ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ rest ÑвлÑеÑÑÑ Ð¼Ð°ÑÑивом из оÑÑавÑиÑ
ÑÑ ÑлеменÑов.
ÐмеÑÑо rest можно иÑполÑзоваÑÑ Ð»Ñбое дÑÑгое название пеÑеменной, пÑоÑÑо ÑбедиÑеÑÑ, ÑÑо пеÑед пеÑеменной еÑÑÑ ÑÑи ÑоÑки и она ÑÑÐ¾Ð¸Ñ Ð½Ð° поÑледнем меÑÑе в деÑÑÑÑкÑÑÑиÑÑÑÑем пÑиÑваивании.
let [name1, name2, ...titles] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];
// ÑепеÑÑ titles = ["Consul", "of the Roman Republic"]
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
ÐÑли в маÑÑиве менÑÑе знаÑений, Ñем в пÑиÑваивании, Ñо оÑибки не бÑдеÑ. ÐÑÑÑÑÑÑвÑÑÑие знаÑÐµÐ½Ð¸Ñ ÑÑиÑаÑÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑми:
let [firstName, surname] = [];
alert(firstName); // undefined
alert(surname); // undefined
ÐÑли Ð¼Ñ Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°Ñение «по ÑмолÑаниÑ» заменило оÑÑÑÑÑÑвÑÑÑее, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑказаÑÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ =:
// знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
let [name = "Guest", surname = "Anonymous"] = ["Julius"];
alert(name); // Julius (из маÑÑива)
alert(surname); // Anonymous (знаÑение по ÑмолÑаниÑ)
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð³Ð¾Ñаздо более ÑложнÑми вÑÑажениÑми или даже ÑÑнкÑиÑми. Ðни вÑполнÑÑÑÑÑ, ÑолÑко еÑли знаÑÐµÐ½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑÑÑ.
ÐапÑимеÑ, здеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем ÑÑнкÑÐ¸Ñ prompt Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð²ÑÑ
знаÑений по ÑмолÑаниÑ.
// prompt запÑÑÑиÑÑÑ ÑолÑко Ð´Ð»Ñ surname
let [name = prompt('name?'), surname = prompt('surname?')] = ["Julius"];
alert(name); // Julius (из маÑÑива)
alert(surname); // ÑезÑлÑÑÐ°Ñ prompt
ÐбÑаÑиÑе внимание, prompt бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑен ÑолÑко Ð´Ð»Ñ Ð¿ÑопÑÑенного знаÑÐµÐ½Ð¸Ñ (surname).
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¾Ð±ÑекÑа
ÐеÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание Ñакже ÑабоÑÐ°ÐµÑ Ñ Ð¾Ð±ÑекÑами.
СинÑакÑиÑ:
let {var1, var2} = {var1:â¦, var2:â¦}
У Ð½Ð°Ñ ÐµÑÑÑ ÑÑÑеÑÑвÑÑÑий обÑÐµÐºÑ Ñ Ð¿Ñавой ÑÑоÑонÑ, коÑоÑÑй Ð¼Ñ Ñ
оÑим ÑазделиÑÑ Ð½Ð° пеÑеменнÑе. ÐÐµÐ²Ð°Ñ ÑÑоÑона ÑодеÑÐ¶Ð¸Ñ Â«Ñаблон» Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
ÑвойÑÑв. РпÑоÑÑом ÑлÑÑае ÑÑо ÑпиÑок названий пеÑеменнÑÑ
в {...}.
ÐапÑимеÑ:
let options = {
title: "Menu",
width: 100,
height: 200
};
let {title, width, height} = options;
alert(title); // Menu
alert(width); // 100
alert(height); // 200
СвойÑÑва options.title, options.width и options.height пÑиÑваиваÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑим пеÑеменнÑм.
ÐоÑÑдок не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ. ÐÐ¾Ñ Ñак â Ñоже ÑабоÑаеÑ:
// изменÑн поÑÑдок в let {...}
let {height, width, title} = { title: "Menu", height: 200, width: 100 }
Шаблон Ñ Ð»ÐµÐ²Ð¾Ð¹ ÑÑоÑÐ¾Ð½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑм и опÑеделÑÑÑ ÑооÑвеÑÑÑвие Ð¼ÐµÐ¶Ð´Ñ ÑвойÑÑвами и пеÑеменнÑми.
ÐÑли Ð¼Ñ Ñ
оÑим пÑиÑвоиÑÑ ÑвойÑÑво обÑекÑа пеÑеменной Ñ Ð´ÑÑгим названием, напÑимеÑ, ÑвойÑÑво options.width пÑиÑвоиÑÑ Ð¿ÐµÑеменной w, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð´Ð²Ð¾ÐµÑоÑие:
let options = {
title: "Menu",
width: 100,
height: 200
};
// { sourceProperty: targetVariable }
let {width: w, height: h, title} = options;
// width -> w
// height -> h
// title -> title
alert(title); // Menu
alert(w); // 100
alert(h); // 200
ÐвоеÑоÑие показÑÐ²Ð°ÐµÑ Â«ÑÑо : кÑда идÑÑ». РпÑимеÑе вÑÑе ÑвойÑÑво width ÑоÑ
ÑанÑеÑÑÑ Ð² пеÑеменнÑÑ w, ÑвойÑÑво height ÑоÑ
ÑанÑеÑÑÑ Ð² h, а title пÑиÑваиваеÑÑÑ Ð¾Ð´Ð½Ð¾Ð¸Ð¼Ñнной пеÑеменной.
ÐÐ»Ñ Ð¿Ð¾ÑенÑиалÑно оÑÑÑÑÑÑвÑÑÑиÑ
ÑвойÑÑв Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, иÑполÑзÑÑ "=", как здеÑÑ:
let options = {
title: "Menu"
};
let {width = 100, height = 200, title} = options;
alert(title); // Menu
alert(width); // 100
alert(height); // 200
Ðак и в ÑлÑÑае Ñ Ð¼Ð°ÑÑивами, знаÑениÑми по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð»ÑбÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ даже ÑÑнкÑии. Ðни вÑполнÑÑÑÑ, еÑли знаÑÐµÐ½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑÑÑ.
Ркоде ниже prompt запÑоÑÐ¸Ñ width, но не title:
let options = {
title: "Menu"
};
let {width = prompt("width?"), title = prompt("title?")} = options;
alert(title); // Menu
alert(width); // (ÑезÑлÑÑÐ°Ñ prompt)
ÐÑ Ñакже можем ÑовмеÑаÑÑ : и =:
let options = {
title: "Menu"
};
let {width: w = 100, height: h = 200, title} = options;
alert(title); // Menu
alert(w); // 100
alert(h); // 200
ÐÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð±Ð¾Ð»ÑÑой обÑÐµÐºÑ Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом ÑвойÑÑв, можно взÑÑÑ ÑолÑко Ñо, ÑÑо нÑжно:
let options = {
title: "Menu",
width: 100,
height: 200
};
// взÑÑÑ ÑолÑко title, игноÑиÑоваÑÑ Ð¾ÑÑалÑное
let { title } = options;
alert(title); // Menu
ÐÑÑаÑок обÑекÑа «â¦Â»
ЧÑо еÑли в обÑекÑе болÑÑе ÑвойÑÑв, Ñем Ñ Ð½Ð°Ñ Ð¿ÐµÑеменнÑÑ ? Ðожем ли Ð¼Ñ Ð²Ð·ÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе нам, а оÑÑалÑнÑе пÑиÑвоиÑÑ ÐºÑда-нибÑдÑ?
Ðожно иÑполÑзоваÑÑ ÑÑоеÑоÑие, как и Ð´Ð»Ñ Ð¼Ð°ÑÑивов. РнекоÑоÑÑÑ ÑÑаÑÑÑ Ð±ÑаÑзеÑÐ°Ñ (IE) ÑÑо не поддеÑживаеÑÑÑ, иÑполÑзÑйÑе Babel Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñила.
ÐÑглÑÐ´Ð¸Ñ Ñак:
let options = {
title: "Menu",
height: 200,
width: 100
};
// title = ÑвойÑÑво Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ title
// rest = обÑÐµÐºÑ Ñ Ð¾ÑÑалÑнÑми ÑвойÑÑвами
let {title, ...rest} = options;
// ÑейÑÐ°Ñ title="Menu", rest={height: 200, width: 100}
alert(rest.height); // 200
alert(rest.width); // 100
letРпÑимеÑаÑ
вÑÑе пеÑеменнÑе бÑли обÑÑÐ²Ð»ÐµÐ½Ñ Ð² пÑиÑваивании: let {â¦} = {â¦}. ÐонеÑно, Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑÑÑеÑÑвÑÑÑие пеÑеменнÑе и не ÑказÑваÑÑ let, но ÑÑÑ ÐµÑÑÑ Ð¿Ð¾Ð´Ð²Ð¾Ñ
.
ÐÐ¾Ñ Ñак не бÑÐ´ÐµÑ ÑабоÑаÑÑ:
let title, width, height;
// оÑибка бÑÐ´ÐµÑ Ð² ÑÑой ÑÑÑоке
{title, width, height} = {title: "Menu", width: 200, height: 100};
ÐÑоблема в Ñом, ÑÑо JavaScript обÑабаÑÑÐ²Ð°ÐµÑ {...} в оÑновном поÑоке кода (не внÑÑÑи дÑÑгого вÑÑажениÑ) как блок кода. Такие блоки кода могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð³ÑÑппиÑовки опеÑаÑоÑов, напÑимеÑ:
{
// блок кода
let message = "Hello";
// ...
alert( message );
}
Так ÑÑо здеÑÑ JavaScript ÑÑиÑаеÑ, ÑÑо Ð²Ð¸Ð´Ð¸Ñ Ð±Ð»Ð¾Ðº кода, оÑÑÑда и оÑибка. Ðа Ñамом-Ñо деле Ñ Ð½Ð°Ñ Ð´ÐµÑÑÑÑкÑÑÑизаÑиÑ.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ JavaScript, ÑÑо ÑÑо не блок кода, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ заклÑÑиÑÑ Ð²ÑÑажение в Ñкобки (...):
let title, width, height;
// ÑейÑÐ°Ñ Ð²ÑÑ ÑабоÑаеÑ
({title, width, height} = {title: "Menu", width: 200, height: 100});
alert( title ); // Menu
ÐÐ»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð´ÐµÑÑÑÑкÑÑÑизаÑиÑ
ÐÑли обÑÐµÐºÑ Ð¸Ð»Ð¸ маÑÑив ÑодеÑÐ¶Ð¸Ñ Ð´ÑÑгие вложеннÑе обÑекÑÑ Ð¸Ð»Ð¸ маÑÑивÑ, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑе ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ñ Ð»ÐµÐ²Ð¾Ð¹ ÑÑоÑонÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð²Ð»ÐµÑÑ Ð±Ð¾Ð»ÐµÐµ глÑбокие ÑвойÑÑва.
РпÑиведÑнном ниже коде options Ñ
ÑÐ°Ð½Ð¸Ñ Ð´ÑÑгой обÑÐµÐºÑ Ð² ÑвойÑÑве size и маÑÑив в ÑвойÑÑве items. Шаблон в левой ÑаÑÑи пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ ÑакÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð²Ð»ÐµÑÑ Ð´Ð°Ð½Ð½Ñе из ниÑ
:
let options = {
size: {
width: 100,
height: 200
},
items: ["Cake", "Donut"],
extra: true
};
// деÑÑÑÑкÑÑÑизаÑÐ¸Ñ ÑазбиÑа на неÑколÑко ÑÑÑок Ð´Ð»Ñ ÑÑноÑÑи
let {
size: { // положим size ÑÑда
width,
height
},
items: [item1, item2], // добавим ÑлеменÑÑ Ðº items
title = "Menu" // оÑÑÑÑÑÑвÑÐµÑ Ð² обÑекÑе (иÑполÑзÑеÑÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ)
} = options;
alert(title); // Menu
alert(width); // 100
alert(height); // 200
alert(item1); // Cake
alert(item2); // Donut
ÐеÑÑ Ð¾Ð±ÑÐµÐºÑ options, кÑоме ÑвойÑÑва extra, коÑоÑое в левой ÑаÑÑи оÑÑÑÑÑÑвÑеÑ, пÑиÑваиваеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑие пеÑеменнÑе:
РиÑоге Ñ Ð½Ð°Ñ ÐµÑÑÑ width, height, item1, item2 и title Ñо знаÑением по ÑмолÑаниÑ.
ÐамеÑим, ÑÑо пеÑеменнÑе Ð´Ð»Ñ size и items оÑÑÑÑÑÑвÑÑÑ, Ñак как Ð¼Ñ Ð²Ð·Ñли ÑÑÐ°Ð·Ñ Ð¸Ñ
ÑодеÑжимое.
УмнÑе паÑамеÑÑÑ ÑÑнкÑий
ÐÑÑÑ ÑиÑÑаÑии, когда ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ паÑамеÑÑов, болÑÑинÑÑво из коÑоÑÑÑ Ð½Ðµ обÑзаÑелÑнÑ. ÐÑо оÑобенно веÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ¸Ñ Ð¸Ð½ÑеÑÑейÑов. ÐÑедÑÑавÑÑе Ñебе ÑÑнкÑиÑ, коÑоÑÐ°Ñ ÑоздаÑÑ Ð¼ÐµÐ½Ñ. Ðна Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑиÑинÑ, вÑÑоÑÑ, заголовок, ÑпиÑок ÑлеменÑов и Ñак далее.
ÐÐ¾Ñ Ñак â Ð¿Ð»Ð¾Ñ Ð¾Ð¹ ÑпоÑоб пиÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑÑнкÑии:
function showMenu(title = "Untitled", width = 200, height = 100, items = []) {
// ...
}
Ð ÑеалÑной жизни пÑоблема заклÑÑаеÑÑÑ Ð² Ñом, как запомниÑÑ Ð¿Ð¾ÑÑдок вÑÐµÑ Ð°ÑгÑменÑов. ÐбÑÑно IDE пÑÑаÑÑÑÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð½Ð°Ð¼, оÑобенно еÑли код Ñ Ð¾ÑоÑо докÑменÑиÑован, но вÑÑ Ð¶Ðµâ¦ ÐÑÑÐ³Ð°Ñ Ð¿Ñоблема заклÑÑаеÑÑÑ Ð² Ñом, как вÑзваÑÑ ÑÑнкÑиÑ, когда болÑÑинÑÑво паÑамеÑÑов пеÑедаваÑÑ Ð½Ðµ надо, и знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ.
Разве ÑÑо Ð²Ð¾Ñ Ñак?
// undefined Ñам, где подÑ
одÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
showMenu("My Menu", undefined, undefined, ["Item1", "Item2"])
ÐÑо вÑглÑÐ´Ð¸Ñ ÑжаÑно. Ð ÑÑановиÑÑÑ Ð½ÐµÑиÑаемÑм, когда Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ дело Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом паÑамеÑÑов.
Ðа помоÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð´ÐµÑÑÑÑкÑÑÑизаÑиÑ!
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаÑÑ Ð¿Ð°ÑамеÑÑÑ ÐºÐ°Ðº обÑекÑ, и ÑÑнкÑÐ¸Ñ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ деÑÑÑÑкÑÑÑиÑÑÐµÑ ÐµÐ³Ð¾ в пеÑеменнÑе:
// Ð¼Ñ Ð¿ÐµÑедаÑм обÑÐµÐºÑ Ð² ÑÑнкÑиÑ
let options = {
title: "My menu",
items: ["Item1", "Item2"]
};
// ...и она немедленно Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑвойÑÑва в пеÑеменнÑе
function showMenu({title = "Untitled", width = 200, height = 100, items = []}) {
// title, items â взÑÑо из options,
// width, height â иÑполÑзÑÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
alert( `${title} ${width} ${height}` ); // My Menu 200 100
alert( items ); // Item1, Item2
}
showMenu(options);
ÐÑ Ñакже можем иÑполÑзоваÑÑ Ð±Ð¾Ð»ÐµÐµ Ñложное деÑÑÑÑкÑÑÑиÑование Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми обÑекÑами и двоеÑоÑием:
let options = {
title: "My menu",
items: ["Item1", "Item2"]
};
function showMenu({
title = "Untitled",
width: w = 100, // width пÑиÑваиваем в w
height: h = 200, // height пÑиÑваиваем в h
items: [item1, item2] // пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ items пÑиÑваиваеÑÑÑ Ð² item1, вÑоÑой в item2
}) {
alert( `${title} ${w} ${h}` ); // My Menu 100 200
alert( item1 ); // Item1
alert( item2 ); // Item2
}
showMenu(options);
ÐолнÑй ÑинÑакÑÐ¸Ñ â Ñакой же, как Ð´Ð»Ñ Ð´ÐµÑÑÑÑкÑÑÑиÑÑÑÑего пÑиÑваиваниÑ:
function showMenu({
incomingProperty: varName = defaultValue
...
})
Тогда Ð´Ð»Ñ Ð¾Ð±ÑекÑа Ñ Ð¿Ð°ÑамеÑÑами бÑÐ´ÐµÑ Ñоздана пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ varName Ð´Ð»Ñ ÑвойÑÑва Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ incomingProperty по ÑмолÑÐ°Ð½Ð¸Ñ ÑÐ°Ð²Ð½Ð°Ñ defaultValue.
ÐожалÑйÑÑа, обÑаÑиÑе внимание, ÑÑо Ñакое деÑÑÑÑкÑÑÑиÑование подÑазÑмеваеÑ, ÑÑо в showMenu() бÑÐ´ÐµÑ Ð¾Ð±ÑзаÑелÑно пеÑедан аÑгÑменÑ. ÐÑли нам нÑÐ¶Ð½Ñ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, Ñо нам ÑледÑÐµÑ Ð¿ÐµÑедаÑÑ Ð¿ÑÑÑой обÑекÑ:
showMenu({}); // ок, вÑе знаÑÐµÐ½Ð¸Ñ - по ÑмолÑаниÑ
showMenu(); // Ñак бÑла Ð±Ñ Ð¾Ñибка
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑпÑавиÑÑ ÑÑо, Ñделав {} знаÑением по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ñего обÑекÑа паÑамеÑÑов:
function showMenu({ title = "Menu", width = 100, height = 200 } = {}) {
alert( `${title} ${width} ${height}` );
}
showMenu(); // Menu 100 200
РпÑиведÑнном вÑÑе коде веÑÑ Ð¾Ð±ÑÐµÐºÑ Ð°ÑгÑменÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ñавен {}, поÑÑÐ¾Ð¼Ñ Ð²Ñегда еÑÑÑ ÑÑо-Ñо, ÑÑо можно деÑÑÑÑкÑÑÑиÑоваÑÑ.
ÐÑого
-
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑазбиваÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð»Ð¸ маÑÑив на пеÑеменнÑе пÑи пÑиÑвоении.
-
ÐолнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑекÑа:
let {prop : varName = defaultValue, ...rest} = objectCвойÑÑво
propобÑекÑаobjectздеÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð¿ÑиÑвоено пеÑеменнойvarName. ÐÑли в обÑекÑе оÑÑÑÑÑÑвÑÐµÑ Ñакое ÑвойÑÑво, пеÑеменнойvarNameпÑиÑваиваеÑÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ.СвойÑÑва, коÑоÑÑе не бÑли ÑпомÑнÑÑÑ, копиÑÑÑÑÑÑ Ð² обÑекÑ
rest. -
ÐолнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¼Ð°ÑÑива:
let [item1 = defaultValue, item2, ...rest] = arrayÐеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾ÑпÑавлÑеÑÑÑ Ð²
item1; вÑоÑой оÑпÑавлÑеÑÑÑ Ð²item2, вÑе оÑÑалÑнÑе ÑлеменÑÑ Ð¿Ð¾Ð¿Ð°Ð´Ð°ÑÑ Ð² маÑÑивrest. -
Ðожно извлекаÑÑ Ð´Ð°Ð½Ð½Ñе из вложеннÑÑ Ð¾Ð±ÑекÑов и маÑÑивов, Ð´Ð»Ñ ÑÑого Ð»ÐµÐ²Ð°Ñ ÑÑоÑона должна имеÑÑ ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ, ÑÑо и пÑаваÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)