...
을 활용한 객체 표현법으로, iterable한 객체를 풀어서 하나 하나의 요소로 전개한다.
spread syntax는 다음과 같은 상황에서 사용한다.
- 배열 literal로 배열을 정의할 때, iterable한 객체를 요소로 사용하고 싶을 때
- 객체 literal로 객체를 정의할 때, iterable한 객체를 요소로 사용하고 싶을 때
- 함수에서 iterable한 객체를 parameter로 선언하거나, 호출 인자로 사용하고 싶을 때
1, 2의 경우는 매우 직관적이다.
var inputArr = ['c', 'd', 'e']
var newArr = ['a', 'b', ...inputArr, 'f', 'g']
console.log(newArr);
🖥 콘솔 출력 결과
['a', 'b', 'c', 'd', 'e', 'f', 'g']
var inputObj = {age: '20', city: 'Seoul'}
var newObj = {name: 'yooni', ...inputObj, gender: female}
console.log(newObj);
🖥 콘솔 출력 결과
{ name: 'yooni', age: '20', city: 'Seoul', gender: 'female' }
함수의 가변 parameter를 sparead syntax를 사용하여 선언한 것으로 배열 형식임
function myFunc (a, b, ...rest) { // 3개의 parameter 중 마지막 parameter로 쓰인 rest parameter
console.log(a, b);
console.log(rest);
}
myFunc(1, 2, 3, 4, 5);
🖥 콘솔 출력 결과
1 2
[ 3, 4, 5 ]
myFunc
의 인자 1, 2
는 매개변수 a, b
에 대응되고 남은 인자들을 배열의 형태로 ...rest
가 받는다. 대응시키고 남은 인자들에 적용되는 parameter이기 때문에 rest parameter는 항상 마지막 parameter여야 한다.
rest parameter는 ES6에서 도입된 개념으로, ES5의 arguments
와 그 기능이 비슷하다. 하지만 arguments는 배열이 아닌 유사배열객체(iterable하며 length를 가질 수 있음)로 배열 obejct의 메소드를 사용할 수 없다는 단점이 있다. 따라서 rest parameter를 사용하길 권장한다.
함수 선언 뿐 아니라, 함수를 호출할 때 인자로 배열/객체를 넣고 싶다면 이 때 spread syntax로 간단하게 호출할 수 있다.
function sum (a, b, c) {
return a+b+c;
}
myArr = [6, 7, 8];
console.log(sum(...myArr)); // 인자에 spread syntax 사용
🖥 콘솔 출력 결과
21