Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
- `Object.assign(dest, src1, ..., srcN)` – копирует свойства из исходных объектов `src1..N` в целевой объект `dest`.
- ...и так далее.

В этой главе мы узнаем, как делать то же самое. А также как передавать таким функциям параметры в виде массива.
В этой главе мы узнаем, как сделать то же самое c нашими собственными функциями и как передавать таким функциям параметры в виде массива.

## Остаточные параметры (`...`)

Вызывать функцию можно с любым количеством аргументов, независимо от того, как она была определена.
Вызывать функцию можно с любым количеством аргументов независимо от того, как она была определена.

Например:
```js run
Expand Down Expand Up @@ -43,7 +43,7 @@ alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
```

Мы можем положить первые несколько параметров в переменные и собрать в массив остальные.
Мы можем положить первые несколько параметров в переменные, а остальные -- собрать в массив.

В примере ниже первые два аргумента функции станут именем и фамилией, а третий и последующие превратятся в массив `titles`:

Expand Down Expand Up @@ -98,7 +98,7 @@ showName("Илья");

Раньше в языке не было остаточных параметров, и получить все аргументы функции можно было только с помощью `arguments`. Этот способ всё ещё работает, мы можем найти его в старом коде.

Но у него есть один недостаток. Хотя `arguments` похож на массив и он тоже перебираемый, это всё же не массив. Он не поддерживает методы массивов, поэтому мы не можем, например, вызвать `arguments.map(...)`.
Но у него есть один недостаток. Хотя `arguments` похож на массив, и его тоже можно перебирать, это всё же не массив. Он не поддерживает методы массивов, поэтому мы не можем, например, вызвать `arguments.map(...)`.

К тому же, `arguments` всегда содержит все аргументы функции — мы не можем получить их часть. А остаточные параметры позволяют это сделать.

Expand Down Expand Up @@ -134,7 +134,7 @@ f(1); // 1
alert( Math.max(3, 5, 1) ); // 5
```

Допустим, у нас массив чисел `[3, 5, 1]`. Как вызвать для него `Math.max`?
Допустим, у нас есть массив чисел `[3, 5, 1]`. Как вызвать для него `Math.max`?

Просто так их не вставишь — `Math.max` ожидает получить список чисел, а не один массив.

Expand Down Expand Up @@ -201,7 +201,7 @@ let str = "Привет";
alert( [...str] ); // П,р,и,в,е,т
```

Посмотрим, что происходит. Под капотом оператор расширения использует итераторы, чтобы собирать элементы. Так же, как это делает `for..of`.
Посмотрим, что происходит. Под капотом оператор расширения использует итераторы, чтобы перебирать элементы. Так же, как это делает `for..of`.

Цикл `for..of` перебирает строку как последовательность символов, поэтому из `...str` получается `"П", "р", "и", "в", "е", "т"`. Получившиеся символы собираются в массив при помощи стандартного объявления массива: `[...str]`.

Expand All @@ -221,7 +221,7 @@ alert( Array.from(str) ); // П,р,и,в,е,т
- `Array.from` работает как с псевдомассивами, так и с итерируемыми объектами
- Оператор расширения работает только с итерируемыми объектами

Выходит, что если нужно сделать из чего угодно массив, `Array.from` — более универсальный метод.
Выходит, что если нужно сделать из чего угодно массив, то `Array.from` — более универсальный метод.


## Итого
Expand All @@ -230,7 +230,7 @@ alert( Array.from(str) ); // П,р,и,в,е,т

Как отличить их друг от друга:

- Если `...` располагается в конце аргументов функции, то это "остаточные параметры". Он собирает остальные неуказанные аргументы и делает из них массив.
- Если `...` располагается в конце списка аргументов функции, то это "остаточные параметры". Он собирает остальные неуказанные аргументы и делает из них массив.
- Если `...` встретился в вызове функции или где-либо ещё, то это "оператор расширения". Он извлекает элементы из массива.

Полезно запомнить:
Expand Down