Loading...

Калдык параметрлери жана жайылтуу оператору

Калдык параметрлери жана жайылтуу оператору

 

Көптөгөн орнотулган JavaScript функциялары аргументтердин ыктыярдуу санын колдойт.

Мисалы:

  • Math.max(arg1, arg2, ..., argN)– өткөндөрдүн максималдуу санын эсептейт.
  • Object.assign(dest, src1, ..., srcN)– баштапкы объекттердин касиеттерин src1..Nмаксаттуу объектке көчүрөт dest.
  • …жана башка.

Бул бөлүмдө биз өзүбүздүн функцияларыбыз менен да ушундай кылууну жана массив сыяктуу функцияларга параметрлерди кантип өткөрүүнү үйрөнөбүз.

Калдык параметрлер ( ...)

Функцияны кандайча аныкталганына карабастан, аргументтердин ар кандай саны менен чакыра аласыз.

Мисалы:

@A@function sum(a, b) {
  return a + b;
}

alert( sum(1, 2, 3, 4, 5) );@A@

Кошумча аргументтер ката кетирбейт. Бирок, албетте, биринчи эки гана эсепке алынат.

Калдык параметрлер үч чекит менен белгилениши мүмкүн .... Сөзмө-сөз, бул: "калган параметрлерди чогултуу жана аларды массивге коюу" дегенди билдирет.

Мисалы, массивдеги бардык аргументтерди чогулталы args:

@A@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@A@

Биринчи бир нече параметрлерди өзгөрмөлөргө салып, калгандарын массивге чогулта алабыз.

Төмөнкү мисалда функциянын биринчи эки аргументи аты жана фамилиясы болуп калат, ал эми үчүнчү жана кийинки аргументтер массивге айланат titles:

@A@function showName(firstName, lastName, ...titles) {
  alert( firstName + ' ' + lastName ); // Юлий Цезарь

  // Оставшиеся параметры пойдут в массив
  // titles = ["Консул", "Император"]
  alert( titles[0] ); // Консул
  alert( titles[1] ); // Император
  alert( titles.length ); // 2
}

showName("Юлий", "Цезарь", "Консул", "Император");@A@
Калган параметрлер аягында жайгаштырылышы керек

Калган параметрлер бардык башка аргументтерди чогултат, андыктан алардын артынан эч нерсе жазуу бекер. Бул ката кетирет:

@A@function f(arg1, ...rest, arg2) { // arg2 после ...rest ?!
  // Ошибка
}@A@

...restар дайым акыркы болушу керек.

Өзгөрмө "аргументтер"

Бардык функция аргументтери псевдо-массивде argumentsалардын иреттик сандарынын астында жайгашкан.

Мисалы:

 
 
@A@function showName() {
  alert( arguments.length );
  alert( arguments[0] );
  alert( arguments[1] );

  // Объект arguments можно перебирать
  // for (let arg of arguments) alert(arg);
}

// Вывод: 2, Юлий, Цезарь
showName("Юлий", "Цезарь");

// Вывод: 1, Илья, undefined (второго аргумента нет)
showName("Илья");@A@

Мурда тилде калдык параметрлери жок болчу жана сиз функциянын бардык аргументтерин колдонуу менен гана ала алсаңыз болот arguments. Бул жол дагы эле иштейт, биз аны эски коддон таба алабыз.

Бирок анын бир кемчилиги бар. Ал массив сыяктуу көрүнгөнү менен argumentsжана аны кайталаса да, ал дагы эле массив эмес. Ал массив ыкмаларын колдобойт, ошондуктан биз, мисалы, чакыра албайбыз arguments.map(...).

Мындан тышкары, argumentsал ар дайым функциянын бардык аргументтерин камтыйт - биз алардын бир бөлүгүн ала албайбыз. Ал эми калган параметрлер муну кылууга мүмкүндүк берет.

Демек, аргументтер менен ыңгайлуу иштөө үчүн, калдык параметрлерин колдонуу жакшы.

Жебе функциялары жок"arguments"

Эгерде жебе функциясына кайрылсак arguments, сырткы "нормалдуу" функциянын аргументтерин алабыз.

Мисал:

@A@function f() {
  let showArg = () => alert(arguments[0]);
  showArg(2);
}

f(1); // 1@A@

Эсибизде болгондой, жебе функцияларынын өзүнүн this. Эми өзүбүздүн объекти жок экенин билебиз arguments.

Кеңейтүү оператору

Параметрлердин тизмесинен массивди кантип алууну үйрөндүк.

Бирок кээде так тескерисин кылуу керек.

Мисалы, орнотулган Math.max функциясы бар . Ал тизмеден эң чоң санды кайтарат:

@A@alert( Math.max(3, 5, 1) ); // 5@A@

Бизде сандар массив бар дейли [3, 5, 1]. Ага кантип чакыруу керек Math.max?

Аларды ушинтип эле киргизе албайсыз - Math.maxал бир массив эмес, сандардын тизмесин алууну күтөт.

@A@let arr = [3, 5, 1];

alert( Math.max(arr) ); // NaN@A@

Албетте, сандарды кол менен киргизсек болот : Math.max(arr[0], arr[1], arr[2]). Бирок, биринчиден, жаман көрүнөт, экинчиден, канча талаш-тартыш болорун дайыма эле биле бербейбиз. Алар көп болушу мүмкүн, же такыр жок болушу мүмкүн.

Бул жерде бизге кеңейтүү оператору жардам берет . Бул калдык параметрлерге окшош - ал да колдонот ..., бирок так карама-каршы келет.

...arrФункцияны чакырууда колдонулганда, ал кайталанган объектти аргументтердин arrтизмесине "кеңейтет".

үчүн Math.max:

@A@let arr = [3, 5, 1];

alert( Math.max(...arr) ); // 5 (оператор "раскрывает" массив в список аргументов)@A@

Ошол сыяктуу эле, биз бир нече кайталануучуларды өткөрө алабыз:

@A@let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];

alert( Math.max(...arr1, ...arr2) ); // 8@A@

Биз жада калса жайылган операторду кадимки маанилер менен айкалыштыра алабыз:

@A@let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];

alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25@A@

Жайылтуу операторун массивдерди бириктирүү үчүн да колдонсо болот:

@A@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)@A@

Жогорудагы мисалдарда биз жайылтуу операторунун касиеттерин көрсөтүү үчүн массивди колдондук, бирок ал ар кандай кайталануучу объектте иштейт.

Мисалы, жайылма оператору сапты символдордун массивине айландыруу үчүн ылайыктуу:

@A@let str = "Привет";

alert( [...str] ); // П,р,и,в,е,т@A@

Келгиле, эмне болорун карап көрөлү. Капоттун астында жайылуу оператору элементтерди кайталоо үчүн итераторлорду колдонот. Ошол сыяктуу эле for..of.

Цикл for..ofсаптын үстүнөн символдордун ырааттуулугу катары кайталанат, ...strошондуктан "П", "р", "и", "в", "е", "т". Натыйжадагы символдор массивдин стандарттык декларациясын колдонуу менен чогултулат: [...str].

Бул тапшырма үчүн биз жана колдоно алабыз Array.from. Ал ошондой эле кайталануучу объектти (мисалы, сап) массивге айлантат:

 
 
@A@let str = "Привет";

// Array.from преобразует перебираемый объект в массив
alert( Array.from(str) ); // П,р,и,в,е,т@A@

Натыйжа окшош [...str].

Бирок ортосунда айырма бар Array.from(obj):[...obj]

  • Array.fromпсевдо-массивдер жана кайталануучулар менен иштейт
  • Жайылма оператору кайталануучуларда гана иштейт.

Көрсө, кандайдыр бир нерседен массив жасоо керек болсо, анда Array.fromуниверсалдуу ыкма.

Бардыгы

"..."Биз аны коддон көргөндө , ал калдык параметрлери да, кеңейтүү оператору да болушу мүмкүн.

Аларды кантип ажыратса болот:

  • ...Функциянын параметрлеринин тизмесинин аягында жайгашкан болсо , анда булар "калдык параметрлер". Ал калган такталбаган аргументтерди чогултат жана алардан массивди түзөт.
  • ...Функция чакырыгында же башка жерде кездешсе, анда бул "кеңейтүү оператору" . Ал массивден элементтерди чыгарат.

эстеген жакшы:

  • Калдык параметрлери чексиз сандагы аргумент менен жаңы функцияларды түзүү үчүн колдонулат.
  • Жайылтуу оператору менен сиз массивди демейки боюнча кадимки аргумент тизмеси менен иштеген функцияга киргизе аласыз.

Бул конструкциялар чогуу маанилердин топтомун массивдерге жана массивдерге которууну жеңилдетет.

Функциянын аргументтерине эски ыкма менен да жетүүгө болот - псевдо-массив аркылуу arguments.