spread와 rest는 모두 (...)을 사용하여 배열/객체 요소를 활용할 수 있는 문법임.
spread를 통해 배열/객체의 요소를 '펼치는' 혹은 '확장하는' 작업을 수행할 수 있음. 그게 무슨 말이냐면...
let array1 = [1, 2, 3];
let array2 = [4, 5, 6];
// Spread 문법을 사용하여 두 배열을 합침
let combinedArray = [...array1, ...array2];
console.log(combinedArray); // 출력: [1, 2, 3, 4, 5, 6]
let originalArray = [1, 2, 3];
// Spread 문법을 사용하여 배열을 복사
let copiedArray = [...originalArray];
console.log(copiedArray); // 출력: [1, 2, 3]
// 원본 배열과 복사본은 다른 객체입니다.
console.log(originalArray === copiedArray); // 출력: false
let array = [2, 3, 4];
// 배열의 시작 부분에 요소 추가
let newArrayStart = [1, ...array];
console.log(newArrayStart); // 출력: [1, 2, 3, 4]
// 배열의 끝 부분에 요소 추가
let newArrayEnd = [...array, 5];
console.log(newArrayEnd); // 출력: [2, 3, 4, 5]
let obj1 = { a: 1, b: 2 };
let obj2 = { c: 3, d: 4 };
// 두 객체를 합쳐 새로운 객체 생성
let combinedObj = { ...obj1, ...obj2 };
console.log(combinedObj); // 출력: { a: 1, b: 2, c: 3, d: 4 }
let obj = { a: 1, b: 2 };
// 프로퍼티를 추가하여 새로운 객체 생성
let updatedObj = { ...obj, c: 3 };
console.log(updatedObj); // 출력: { a: 1, b: 2, c: 3 }
// 기존 프로퍼티를 변경하여 새로운 객체 생성
let modifiedObj = { ...obj, b: 20 };
console.log(modifiedObj); // 출력: { a: 1, b: 20 }
function multiply(a, b, c) {
return a * b * c;
}
let numbers = [2, 3, 4];
// Spread 문법을 사용하여 배열의 요소를 개별 인수로 전달
let product = multiply(...numbers);
console.log(product); // 출력: 24
반면, rest는 여러 요소를 하나로 '모으는' 역할을 수행함.
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4)); // 출력: 10
console.log(sum(5, 10, 15)); // 출력: 30
// Rest (destructuring)
const [first, second, ...rest] = [1, 2, 3, 4, 5];
console.log(rest); // 출력: [3, 4, 5]
// Spread
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
console.log(arr2); // 출력: [1, 2, 3, 4, 5]

이 예시를 보면
우측에 있는 원래 배열 [1,2,3,4,5]를 각각 first, second와 ...rest라는 const에 할당함.
array의 structure를 분해(destructuring)한 것.
// Rest (destructuring)
const {a, b, ...rest} = {a: 1, b: 2, c: 3, d: 4};
console.log(rest); // 출력: {c: 3, d: 4}

출처1) https://soopdop.github.io/2020/12/02/rest-and-spread-in-javascript/
출처2) https://www.freecodecamp.org/news/javascript-rest-vs-spread-operators/
출처3) https://soopdop.github.io/2020/12/02/rest-and-spread-in-javascript/