35장 스프레드 문법
1. 스프레드 문법
- ES6에서 도입되었으며, …은 하나로 뭉쳐있는 여러 값들의 집합을 펼쳐서 개별적인 값들의 목록으로 만든다.
- 대상은 Array, String, Map, Set, DOM 컬렉션 arguments와 같이 for …of로 순회할 수 있는 이터러블에 한정된다.
❌ 주의할 점
- 스프레드 문법의 결과물은 값이 아니다.
const a = ...[1,2,3] // 안돼요~~
- 쉼표로 구분한 값의 목록을 사용하는 문맥에서만 사용할 수 있다.
- 함수 호출문의 인수 목록
- 배열 리터럴의 요소 목록
- 객체 리터럴의 프로퍼티 목록
문맥에 따른 활용 방법
- 함수 호출문의 인수 목록에서 사용하는 경우
// Math.max, min const arr = [1,2,3]; const max = Math.max(arr) // -> NaN // 근데 사람들은 배열을 쓴다. 어떻게 쓰는것인가..? // Math.max 메서드는 ,로 구분된 인수 목록들중 가장 큰 값을 반환한다. // 또한 매개변수 개수를 확정할 수 없는 가변 인자 함수다. // 그러므로 배열을 펼쳐서, 요소들을 개별적인 값으로 만든 후에 인수로 전달해야 한다. // 우리가 배운 apply함수를 사용하면 두번째 배열을 펼쳐서 전달가능했다. const max = Math.max.apply(null, arr)); // -> 3 // 스프레드 문법을 사용하면 한방에 가능하다~! const max = Math.max(...arr);
❌ 주의할 점
- Rest 파라미터와 형태가 동일하여 혼동될 수 있으므로 주의가 필요하다. (반대의 개념)
function foo(...rest) { console.log(rest); // 1,2,3 -> [1,2,3] } foo(...[1,2,3]); // 1 2 3 전달 -> ...rest -> [1,2,3] 되버리기
- 배열 리터럴 내부에서 사용하는 경우
// 1. concat -> 두 배열 합치기 const a = [1,2]; const b = [3,4]; let arr = a.concat(b); console.log(arr); // -> [1,2,3,4]; let concatArr = [...a, ...b] console.log(concatArr); // -> [1,2,3,4];
// 2. splice const a = [1,4]; const b = [2,3]; // splice 는 배열 추가 or 삭제가 가능합니다. (원본 배열이 바뀐다) // 세번째 인자에 배열을 추가하면 해당 위치에 추가가 됩니다. a.splice(1,0,b); console.log(a); // -> [1,2,3,4] x [1,[2,3],4] Array.prototype.splice.apply(a, [1,0].concat(b)); // 복잡하게 넣기 a.splice(1,0,...b); // -> [1,2,3,4]
// 3. 배열 복사 (slice) // slice는 원본 배열을 바꾸지 않습니다! const origin = [1,2]; const copy = origin.slice(); const copy = [...origin];
// 4. 이터러블을 배열로 변환 // 유사배열 객체이면서, 이터러블일때 많이 사용 function sum() { let args = Array.prototype.slice.call(arguments); // 배열로 변환 // 원래 방법 return args.reduce((acc,cur) => acc+=cur, 0); // 스프레드 return [...arguments].reduce((acc,cur) => acc += cur, 0); } // rest 파라미터 (args에 전달된 인수들의 목록을 배열로 전달받는다.) const sum = (...args) => args.reduce((acc,cur) => pre+cur, 0); console.log(sum(1,2,3)); // -> 6 // 이터러블이 아닌 유사 배열 객체를 변환할 때 Array.from(array);
- 객체 리터럴 내부에서 사용하는 경우 (최신 기술)
// 객체 복사나 객체 병합에 많이 쓰임 // 원래 방법 // Object.assign을 써야 되었음 const merged = Object.assign({}, {x:1, y:2}, {y: 10}, {z: 3}); console.log(merged); // -> {x: 1, y: 10, z: 3}; // 객체 복사 const obj = {x: 1, y: 2}; const copy = {...obj}; // 객체 병합 const merged = {x: 1, y: 2, ...{a: 3, b: 4}}; console.log(merged); // {x:1, y:2, a:3, b:4}
- 객체 리터럴 내부에서 사용하는 경우 (최신 기술)
36장 디트럭처링 할당
1. 디스트럭처링 할당
- 구조 분해 할당이라고도 부르며, 구조화된 배열과 같은 이터러블 또는 객체를 비 구조화 하여 1개 이상의 변수에 개별적으로 할당하는 것을 말한다.
2. 배열 디스트럭처링 할당(구조 분해 할당)
- 배열 구조 분해 할당을 위해서는 할당 연산자 왼쪽에 값을 할당받을 변수를 선언해야 한다.
- 우변에는 이터러블을 할당해야 한다.
- 배열 구조 분해 할당의 기준은 배열의 인덱스이다. 순서대로 할당된다.
- 반드시 요소 개수가 일치할 필요는 없다.
const arr = [1,2,3]; const [one, two, three] = arr; console.log(one, two, three); // 1, 2, 3 // 기본값 설정도 가능함, 그러나 할당된 값이 우선시 된다. const [one, two] = arr; // 1 2 3
3. 객체 디스트럭처링 할당(구조 분해 할당)
- 객체 구조 분해 할당에서는 프로퍼티 키를 사용한다.
- 좌변에는 변수를 객체 리터럴 형식으로 선언해야 한다.
- 우변에는 객체나 객체로 평가될 수 있는 표현식을 할당해야 한다. (안하면 에러)
const user = {firstName: 'shin', lastName: 'dongwoo'}; const {firstName, lastName} = user; // 축약표현 const {firstName: a,lastName: b} = user; // 이렇게도 가능 // 기본값 설정 가능, 할당된 값이 우선 const {firstName = 'Frong', lastName} = arr; // shin dongwoo // 객체를 인수로 전달받는 함수의 매개변수에도 사용이 가능하다. function print(todo){ console.log(`${todo.id}, ${todo.content}`) } print({id: 1, content: '발표 준비'});
헷갈리는 경우
- 배열안에 객체가 있을 경우
- 배열 구조 분해 할당과 객체 구조 분해 할당이 헷갈릴 수 있다.
const todos = [ {id: 1, content: '플젝하기', completed: false }, {id: 2, content: '스터디하기', completed: false}, {id: 3, content: '발표하기', completed: false}, ] const [, {id}] = todos; console.log(id) // ? // -> 2, 배열 구조 분해 할당으로 두번째 요소의 id만 쓰게 됨
- 중첩 객체의 경우
const user ={ name: 'Dong', address: { zipCode: '03030', city: 'Seoul' } } const {address: {city}} = user; console.log(city); // 'Seoul'
- Rest 프로퍼티
const {x, ...rest} = {x: 1, y:2, z: 3}; console.log(x, rest);
퀴즈
const getPosts = async () => { const {data} = await axios.get(url); // {data}는 무엇일까요? return data } const Header = ({handleClick, ...props}) => { // 이것은 무엇일까요? ... } (data.map(({id, title}) => ( // 이것은 무엇일까요? <div key={id}>{title}</div> )))
정답
객체 구조 분해할당, 객체 구조 분해 할당 + rest 파라미터, 객체 구조 분해 할당