JS операторы spread vs rest

Какая разница между оператором spread и оператором rest? В каких ситуациях мне нужно использовать spread, а в каких rest?

Сперва нужно сказать, что оба эти оператора имеют один и тот же вид записи: "... ", но нужно понимать, что в различном контексте данная запись будет вести себя по разному (в одном контексте он будет работать как оператор rest, а в другом случае может работать, как оператор spread)

Оператор Spread или же оператор разворота – позволяет разворачивать элементы массива в качестве аргументов функции или в аргументы другого массива.

Например если у нас есть два массива a и b (количество элементов в них может быть произвольное):

var a = [1, 2];
var b = [3, 4];

если нам нужно поместить элементы данных массивов в другой массив, мы бы могли сделать это следующим образом:

var c = [a[0], a[1], b[0], b[1]]; // в результате получим массив [1, 2, 3, 4]

но наверняка не всегда это будет удобно сделать. конечно же мы можем сделать всё через использование циклов, но это дополнительные строчки кода и это делается намного проще через оператор spred:

var c = [...a, ...b]; // в результате получим массив [1, 2, 3, 4]

в данном контексте оператор spread ("...") развернёт массивы a и b (достанет все их элементы и подставит в качестве элементов нового массива), если бы не было "...", то в результате мы бы получили массив массивов (не то что мы хотели!).

Также оператор spred может быть использован при необходимости передачи элементов массива в качестве параметра функции, например если у нас есть функция Sum принимающая два параметра, а также массив arr из двух элементов, тогда вместо того, что бы писать следующий код при вызове:

Sum(a[0], a[1])

мы могли бы записать это следующим образом используя оператор spread:

Sum(...a)

и получили бы точно такой же результат!

Теперь расскажем о операторе rest, он используеться только при объявлении параметра в функции. Он позволяет указать, что функция может принимать различное количество параметров и все переданные дополнительно параметры должны быть записаны в параметр к которому был применён оператор rest. Пример функции имеющий один параметр к которому применён оператор rest:

function PrintPersonInfo(name, age, ...skills)
{
     // какой-то код 
}

в данном случае в параметр skills будут записаны все доп. параметры при вызове, например:

PrintPersonInfo('Alex', 28, "hardworking", "love programming", "know Unit Testing")

в данном случае при вызове функции PrintPersonInfo в параметр skills будет записано: ["hardworking", "love programming", "know Unit Testing"]

Параметр с применённым к нему оператор rest должен ВСЕГДА идти последним!

2 Симпатий

можете, как дополнению к ответу выше, прочитать данную статью http://jsraccoon.ru/es6-spread-rest

1 Симпатия