Какая разница между оператором 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 должен ВСЕГДА идти последним!
можете, как дополнению к ответу выше, прочитать данную статью http://jsraccoon.ru/es6-spread-rest
thanks for the awesome information.