Ðногие вÑÑÑоеннÑе ÑÑнкÑии JavaScript поддеÑживаÑÑ Ð¿ÑоизволÑное колиÑеÑÑво аÑгÑменÑов.
ÐапÑимеÑ:
Math.max(arg1, arg2, ..., argN)â вÑÑиÑлÑÐµÑ Ð¼Ð°ÐºÑималÑное ÑиÑло из пеÑеданнÑÑ .Object.assign(dest, src1, ..., srcN)â копиÑÑÐµÑ ÑвойÑÑва из иÑÑ Ð¾Ð´Ð½ÑÑ Ð¾Ð±ÑекÑовsrc1..Nв Ñелевой обÑекÑdest.- â¦Ð¸ Ñак далее.
Ð ÑÑой главе Ð¼Ñ Ñзнаем, как ÑделаÑÑ Ñо же Ñамое Ñ Ð½Ð°Ñими ÑобÑÑвеннÑми ÑÑнкÑиÑми и как пеÑедаваÑÑ Ñаким ÑÑнкÑиÑм паÑамеÑÑÑ Ð² виде маÑÑива.
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ (...)
ÐÑзÑваÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ Ð»ÑбÑм колиÑеÑÑвом аÑгÑменÑов незавиÑимо Ð¾Ñ Ñого, как она бÑла опÑеделена.
ÐапÑимеÑ:
function sum(a, b) {
return a + b;
}
alert( sum(1, 2, 3, 4, 5) );
ÐиÑние аÑгÑменÑÑ Ð½Ðµ вÑзовÑÑ Ð¾ÑибкÑ. Ðо, конеÑно, поÑÑиÑаÑÑÑÑ ÑолÑко пеÑвÑе два.
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ñ ÑеÑез ÑÑи ÑоÑки .... ÐÑквалÑно ÑÑо знаÑиÑ: «ÑобеÑи оÑÑавÑиеÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¸ положи иÑ
в маÑÑив».
ÐапÑимеÑ, ÑобеÑÑм вÑе аÑгÑменÑÑ Ð² маÑÑив args:
function sumAll(...args) { // args â Ð¸Ð¼Ñ Ð¼Ð°ÑÑива
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ положиÑÑ Ð¿ÐµÑвÑе неÑколÑко паÑамеÑÑов в пеÑеменнÑе, а оÑÑалÑнÑе â ÑобÑаÑÑ Ð² маÑÑив.
РпÑимеÑе ниже пеÑвÑе два аÑгÑменÑа ÑÑнкÑии ÑÑанÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ и Ñамилией, а ÑÑеÑий и поÑледÑÑÑие пÑевÑаÑÑÑÑÑ Ð² маÑÑив titles:
function showName(firstName, lastName, ...titles) {
alert( firstName + ' ' + lastName ); // Юлий ЦезаÑÑ
// ÐÑÑавÑиеÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¿Ð¾Ð¹Ð´ÑÑ Ð² маÑÑив
// titles = ["ÐонÑÑл", "ÐмпеÑаÑоÑ"]
alert( titles[0] ); // ÐонÑÑл
alert( titles[1] ); // ÐмпеÑаÑоÑ
alert( titles.length ); // 2
}
showName("Юлий", "ЦезаÑÑ", "ÐонÑÑл", "ÐмпеÑаÑоÑ");
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ ÑобиÑаÑÑ Ð²Ñе оÑÑалÑнÑе аÑгÑменÑÑ, поÑÑÐ¾Ð¼Ñ Ð±ÐµÑÑмÑÑленно пиÑаÑÑ ÑÑо-либо поÑле Ð½Ð¸Ñ . ÐÑо вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ:
function f(arg1, ...rest, arg2) { // arg2 поÑле ...rest ?!
// ÐÑибка
}
...rest должен вÑегда бÑÑÑ Ð¿Ð¾Ñледним.
ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ "arguments"
ÐÑе аÑгÑменÑÑ ÑÑнкÑии наÑ
одÑÑÑÑ Ð² пÑевдомаÑÑиве arguments под Ñвоими поÑÑдковÑми номеÑами.
ÐапÑимеÑ:
function showName() {
alert( arguments.length );
alert( arguments[0] );
alert( arguments[1] );
// ÐбÑÐµÐºÑ arguments можно пеÑебиÑаÑÑ
// for (let arg of arguments) alert(arg);
}
// ÐÑвод: 2, Юлий, ЦезаÑÑ
showName("Юлий", "ЦезаÑÑ");
// ÐÑвод: 1, ÐлÑÑ, undefined (вÑоÑого аÑгÑменÑа неÑ)
showName("ÐлÑÑ");
РанÑÑе в ÑзÑке не бÑло оÑÑаÑоÑнÑÑ
паÑамеÑÑов, и полÑÑиÑÑ Ð²Ñе аÑгÑменÑÑ ÑÑнкÑии можно бÑло ÑолÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ arguments. ÐÑÐ¾Ñ ÑпоÑоб вÑÑ ÐµÑÑ ÑабоÑаеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ найÑи его в ÑÑаÑом коде.
Ðо Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð¾Ð´Ð¸Ð½ недоÑÑаÑок. ХоÑÑ arguments поÑ
ож на маÑÑив, и его Ñоже можно пеÑебиÑаÑÑ, ÑÑо вÑÑ Ð¶Ðµ не маÑÑив. Ðн не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°ÑÑивов, поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð½Ðµ можем, напÑимеÑ, вÑзваÑÑ arguments.map(...).
Ð ÑÐ¾Ð¼Ñ Ð¶Ðµ, arguments вÑегда ÑодеÑÐ¶Ð¸Ñ Ð²Ñе аÑгÑменÑÑ ÑÑнкÑии â Ð¼Ñ Ð½Ðµ можем полÑÑиÑÑ Ð¸Ñ
ÑаÑÑÑ. РоÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑÑо ÑделаÑÑ.
СооÑвеÑÑÑвенно, Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ Ñдобной ÑабоÑÑ Ñ Ð°ÑгÑменÑами лÑÑÑе иÑполÑзоваÑÑ Ð¾ÑÑаÑоÑнÑе паÑамеÑÑÑ.
"arguments"ÐÑли Ð¼Ñ Ð¾Ð±ÑаÑимÑÑ Ðº arguments из ÑÑÑелоÑной ÑÑнкÑии, Ñо полÑÑим аÑгÑменÑÑ Ð²Ð½ÐµÑней «ноÑмалÑной» ÑÑнкÑии.
ÐÑимеÑ:
function f() {
let showArg = () => alert(arguments[0]);
showArg(2);
}
f(1); // 1
Ðак Ð¼Ñ Ð¿Ð¾Ð¼Ð½Ð¸Ð¼, Ñ ÑÑÑелоÑнÑÑ
ÑÑнкÑий Ð½ÐµÑ ÑобÑÑвенного this. ТепеÑÑ Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼, ÑÑо Ð½ÐµÑ Ð¸ Ñвоего обÑекÑа arguments.
ÐпеÑаÑÐ¾Ñ ÑаÑÑиÑениÑ
ÐÑ Ñзнали, как полÑÑиÑÑ Ð¼Ð°ÑÑив из ÑпиÑка паÑамеÑÑов.
Ðо иногда нÑжно ÑделаÑÑ Ð² ÑоÑноÑÑи пÑоÑивоположное.
ÐапÑимеÑ, еÑÑÑ Ð²ÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Math.max. Ðна возвÑаÑÐ°ÐµÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑее ÑиÑло из ÑпиÑка:
alert( Math.max(3, 5, 1) ); // 5
ÐопÑÑÑим, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼Ð°ÑÑив ÑиÑел [3, 5, 1]. Ðак вÑзваÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Math.max?
ÐÑоÑÑо Ñак иÑ
не вÑÑавиÑÑ â Math.max Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑпиÑок ÑиÑел, а не один маÑÑив.
let arr = [3, 5, 1];
alert( Math.max(arr) ); // NaN
ÐонеÑно, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вводиÑÑ ÑиÑла вÑÑÑнÑÑ : Math.max(arr[0], arr[1], arr[2]). Ðо, во-пеÑвÑÑ
, ÑÑо плоÑ
о вÑглÑдиÑ, а, во-вÑоÑÑÑ
, Ð¼Ñ Ð½Ðµ вÑегда знаем, ÑколÑко бÑÐ´ÐµÑ Ð°ÑгÑменÑов. ÐÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ°Ðº оÑÐµÐ½Ñ Ð¼Ð½Ð¾Ð³Ð¾, Ñак и не бÑÑÑ ÑовÑем.
Ð ÑÑÑ Ð½Ð°Ð¼ Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑаÑÑиÑениÑ. Ðн поÑ
ож на оÑÑаÑоÑнÑе паÑамеÑÑÑ â Ñоже иÑполÑзÑÐµÑ ..., но Ð´ÐµÐ»Ð°ÐµÑ ÑовеÑÑенно пÑоÑивоположное.
Ðогда ...arr иÑполÑзÑеÑÑÑ Ð¿Ñи вÑзове ÑÑнкÑии, он «ÑаÑÑиÑÑеÑ» пеÑебиÑаемÑй обÑÐµÐºÑ arr в ÑпиÑок аÑгÑменÑов.
ÐÐ»Ñ Math.max:
let arr = [3, 5, 1];
alert( Math.max(...arr) ); // 5 (опеÑаÑÐ¾Ñ "ÑаÑкÑÑваеÑ" маÑÑив в ÑпиÑок аÑгÑменÑов)
ÐÑим же ÑпоÑобом Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаÑÑ Ð½ÐµÑколÑко иÑеÑиÑÑемÑÑ Ð¾Ð±ÑекÑов:
let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
alert( Math.max(...arr1, ...arr2) ); // 8
ÐÑ Ð´Ð°Ð¶Ðµ можем комбиниÑоваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑми знаÑениÑми:
let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25
ÐпеÑаÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð¸ Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð¼Ð°ÑÑивов:
let arr = [3, 5, 1];
let arr2 = [8, 9, 15];
let merged = [0, ...arr, 2, ...arr2];
alert(merged); // 0,3,5,1,2,8,9,15 (0, заÑем arr, заÑем 2, в конÑе arr2)
РпÑимеÑÐ°Ñ Ð²ÑÑе Ð¼Ñ Ð¸ÑполÑзовали маÑÑив, ÑÑÐ¾Ð±Ñ Ð¿ÑодемонÑÑÑиÑоваÑÑ ÑвойÑÑва опеÑаÑоÑа ÑаÑÑиÑениÑ, но он ÑабоÑÐ°ÐµÑ Ñ Ð»ÑбÑм пеÑебиÑаемÑм обÑекÑом.
ÐапÑимеÑ, опеÑаÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð¹Ð´ÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÑевÑаÑиÑÑ ÑÑÑÐ¾ÐºÑ Ð² маÑÑив Ñимволов:
let str = "ÐÑивеÑ";
alert( [...str] ); // Ð,Ñ,и,в,е,Ñ
ÐоÑмоÑÑим, ÑÑо пÑоиÑÑ
одиÑ. Ðод капоÑом опеÑаÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÐµÑ Ð¸ÑеÑаÑоÑÑ, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑебиÑаÑÑ ÑлеменÑÑ. Так же, как ÑÑо Ð´ÐµÐ»Ð°ÐµÑ for..of.
Цикл for..of пеÑебиÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ ÐºÐ°Ðº поÑледоваÑелÑноÑÑÑ Ñимволов, поÑÑÐ¾Ð¼Ñ Ð¸Ð· ...str полÑÑаеÑÑÑ "Ð", "Ñ", "и", "в", "е", "Ñ". ÐолÑÑивÑиеÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑобиÑаÑÑÑÑ Ð² маÑÑив пÑи помоÑи ÑÑандаÑÑного обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива: [...str].
ÐÐ»Ñ ÑÑой задаÑи Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸ Array.from. Ðн Ñоже пÑеобÑазÑÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ (Ñакой как ÑÑÑока) в маÑÑив:
let str = "ÐÑивеÑ";
// Array.from пÑеобÑазÑÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ð² маÑÑив
alert( Array.from(str) ); // Ð,Ñ,и,в,е,Ñ
РезÑлÑÑÐ°Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñен [...str].
Ðо Ð¼ÐµÐ¶Ð´Ñ Array.from(obj) и [...obj] еÑÑÑ ÑазниÑа:
Array.fromÑабоÑÐ°ÐµÑ ÐºÐ°Ðº Ñ Ð¿ÑевдомаÑÑивами, Ñак и Ñ Ð¸ÑеÑиÑÑемÑми обÑекÑами- ÐпеÑаÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑабоÑÐ°ÐµÑ ÑолÑко Ñ Ð¸ÑеÑиÑÑемÑми обÑекÑами
ÐÑÑ
одиÑ, ÑÑо еÑли нÑжно ÑделаÑÑ Ð¸Ð· Ñего Ñгодно маÑÑив, Ñо Array.from â более ÑнивеÑÑалÑнÑй меÑод.
ÐÑого
Ðогда Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ "..." в коде, ÑÑо могÑÑ Ð±ÑÑÑ ÐºÐ°Ðº оÑÑаÑоÑнÑе паÑамеÑÑÑ, Ñак и опеÑаÑÐ¾Ñ ÑаÑÑиÑениÑ.
Ðак оÑлиÑиÑÑ Ð¸Ñ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга:
- ÐÑли
...ÑаÑполагаеÑÑÑ Ð² конÑе ÑпиÑка паÑамеÑÑов ÑÑнкÑии, Ñо ÑÑо «оÑÑаÑоÑнÑе паÑамеÑÑÑ». Ðн ÑобиÑÐ°ÐµÑ Ð¾ÑÑалÑнÑе неÑказаннÑе аÑгÑменÑÑ Ð¸ Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ð· Ð½Ð¸Ñ Ð¼Ð°ÑÑив. - ÐÑли
...вÑÑÑеÑилÑÑ Ð² вÑзове ÑÑнкÑии или где-либо еÑÑ, Ñо ÑÑо «опеÑаÑÐ¾Ñ ÑаÑÑиÑениÑ». Ðн Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑлеменÑÑ Ð¸Ð· маÑÑива.
Ðолезно запомниÑÑ:
- ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¸ÑполÑзÑÑÑÑÑ, ÑÑÐ¾Ð±Ñ ÑоздаваÑÑ Ð½Ð¾Ð²Ñе ÑÑнкÑии Ñ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм ÑиÑлом аÑгÑменÑов.
- С помоÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑавиÑÑ Ð¼Ð°ÑÑив в ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑабоÑÐ°ÐµÑ Ñ Ð¾Ð±ÑÑнÑм ÑпиÑком аÑгÑменÑов.
ÐмеÑÑе ÑÑи конÑÑÑÑкÑии помогаÑÑ Ð»ÐµÐ³ÐºÐ¾ пÑеобÑазовÑваÑÑ Ð½Ð°Ð±Ð¾ÑÑ Ð·Ð½Ð°Ñений в маÑÑÐ¸Ð²Ñ Ð¸ обÑаÑно.
РаÑгÑменÑам ÑÑнкÑии можно обÑаÑаÑÑÑÑ Ð¸ по-ÑÑаÑÐ¾Ð¼Ñ â ÑеÑез пÑевдомаÑÑив arguments.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)