Spread & Rest syntax

October 20, 2022

JavaScript ES6 문법 spread & rest 에 대해

Spread

JavaScript ES6에는 spread syntax가 있는데 이는 여러 객체와 배열을 병합하거나 원본 객체와 배열의 불변성을 지킬 때 사용할 수 있다. spread 문법은 선언된 변수(배열, 객체)앞에... 을 붙혀 사용한다.

아래 예시를 살펴보자면,

// 예시) 배열
const ex1 = [1, 2, 3]
const ex2 = [...ex1, 4, 5, 6]
console.log(ex2) // [1, 2, 3, 4, 5, 6]

ex2 라는 배열 안에 …ex1 을 넣어주게 되면 배열 ex1 을 포함한 모든 요소들이 출력된다.

const ex1 = [1, 2, 3]
const ex2 = [4, 5,...ex1, 6]
console.log(ex2) // [4, 5, 1, 2, 3, 6]

위의 경우처럼 위치와 상관없이 …ex1 을 넣는 곳에 배열이 spread된다.

객체의 경우에도 마찬가지로

const one = {
	jan : 1,
	feb : 2, 
	mar : 3,
}
const two = {
	apr : 4,
	may : 5
}
const three = {...one, ...two}
console.log(three) // {jan : 1,feb : 2, mar : 3, apr : 4, may : 5}

객체의 경우에도 위치와 상관없이 스프레드 문법이 들어가는 곳에 맞춰 객체에 병합된다.

리액트를 예로 들면 state의 불변성을 지켜주기 위해 변화가 일어나야할 컴포넌트에서 spread 문법을 사용하여 원본을 복사한 뒤 새로운 배열, 객체를 만들어 사용한다.

rest syntax

spread 문법 처럼 ...을 붙혀 사용하는 것은 같지만 역할이 다르다. rest는 객체와 배열, 함수의 파라미터에서 사용된다. 또한 rest를 객체와 배열에서 사용할 때는 구조 분해 할당 문법과 함께 사용된다.

객체에서 rest문법을 사용할 때

const one = {
	jan : 1,
	feb : 2, 
	mar : 3,
}
// 구조분해할당
const { jan, ...rest } = one
console.log(jan) // 1
console.log(rest) // {feb : 2, mar: 3}

위의 경우처럼 rest안엔 jan을 제외한 값들이 객체형태로 들어있게 된다.

rest문법이라고 해서 꼭 rest라는 이름으로 하지 않아도 되며 다른 이름도 가능하다.

배열에서 rest문법을 사용할 때

const ex1 = [1, 2, 3, 4, 5, 6]
const [jan, ...rest] = ex1
console.log(jan) // 1
console.log(rest) // [2, 3, 4, 5, 6]

const ex2 = [1, 2, 3, 4, 5, 6]
const [...rest, jun] = ex2
// -> 해당 경우로 작성할 경우 오류 발생. 

ex1의 방식처럼 첫 요소를 빼고 나머지 배열을 rest에 담을 수 있지만

ex2처럼 중간이나 마지막요소를 빼오려고할 때는 오류가 발생한다.

매개변수로 rest문법을 사용할 때

// 매개변수를 모두 더하는 sum 함수
// 매개변수의 갯수가 예측되지 않을때 rest문법을 이용하여 매개변수 값들을 받을 수 있다. 
const sum = (...rest) => {
	// 고차함수인 reduce를 이용 
	return rest.reduce((acc, current) => acc + current, 0);
}
const result = sum(7,8,9)
console.log(result) // 25

위의 경우처럼 파라미터의 값들이 몇 개가 들어갈지 예측할 수 없을 때 rest문법을 사용할 수 있다.


참조