모던 자바스크립트 Deep Dive - 35. 스프레드 문법

지영·2022년 2월 17일
0

JavaScript

목록 보기
32/37
post-thumbnail

스프레드 문법


ES6에서 도입된 스프레드 문법 ... 은 하나로 뭉쳐 있는 여러 값들의 집합을 펼쳐서(spread)
개별적인 값들의 목록으로 만든다.


스프레드 문법을 사용할 수 있는 대상은 Array, String, Map, Set, DOM 컬렉션(NodeList, HTMLCollection), argument 와 같이
--> for ... of 문으로 순회할 수 있는 이터러블에 한정된다.

스프레드 문법 ... 은 이터러블 객체에만 사용 가능하나,
--> 스프레드 프로퍼티 ...는 일반 객체를 대상으로도 사용이 가능하다!

⭐️ 스프레드 문법의 결과는 값이 아닌 값들의 목록!

스프레드 문법은 이터러블을 펼쳐서 요소들을 개별적인 값들의 목록으로 만든다.

값이 아닌 값들의 목록이다.

즉, 스프레드 문법의 결과는 값이 아니다!

이는 스프레드 문법 ... 이 피연산자를 연산하여 값을 생성하는 --> '연산자' 가 아님을 의미한다!텍스트

스프레드 문법의 결과
--> 값이 아닌, 값들의 목록 이기 때문에 변수에 할당할 수 없다!

// 스프레드 문법의 결과는 값이 아닌 값들의 목록이므로
// 변수에 할당할 수 없다.
const list = ...[1, 2, 3]; // SyntaxError: /src/index.js: Unexpected token..

💡 스프레드 문법의 결과물을 사용 가능한 문맥

스프레드 문법의 결과물은 값으로 사용할 수 없고,
다음과 같이 쉼표로 구분한 값의 목록을 사용하는 문맥에서만 사용할 수 있다!

  1. 함수 호출문의 인수 목록
    --> 배열이나 객체를 해체해서 값의 목록을 인수로 전달한다!
  2. 배열 리터럴의 요소 목록
  3. 객체 리터럴의 프로퍼티 목록

35.1 함수 호출문의 인수 목록에서 사용하는 경우

❗️스프레드 문법과 Rest 파라미터

스프레드 문법은 Rest 파라미터와 형태가 동일하여 혼동할 수 있으므로 주의할 필요가 있다.

Rest 파라미터
함수에 전달된 인수들의 목록을 배열로 전달받기 위해
--> 매개변수 이름 앞에 ... 을 붙이는 것이다.

스프레드 문법
여러 개의 값이 하나로 뭉쳐있는 배열과 같은 이터러블 객체를 펼쳐서
--> 개별적인 값들의 목록을 만드는 것
이다.

따라서 Rest 파라미터와 스프레드 문법은 서로 반대의 개념이다!


35.2 배열 리터럴 내부에서 사용하는 경우


35.2.1 concat

✍️ 스프레드 문법을 사용하면 별도의 메서드를 사용하지 않고
--> 배열 리터럴만으로 2개의 배열을 1개의 배열로 결합할 수 있다.

// ES6
const arr = [...[1, 2], ...[3, 4]];
console.log(arr); // [1, 2, 3, 4]

35.2.2 splice

✍️ 스프레드 문법을 사용하면 splice 메서드를 사용시, 세 번째 인수로 배열을 전달하면 배열 자체가 추가된다.
배열을 해체해서 전달하려면 ES5까지는 apply 메서드를 사용했지만,
ES6의 스프레드 문법을 사용하면 더욱 간결하고 가독성 좋게 배열을 해체해서 전달할 수 있다.

// ES6
const arr1 = [1, 4];
const arr2 = [2, 3];

arr1.splice(1, 0, ...arr2);
console.log(arr1); // [1, 2, 3, 4]

35.2.3 배열 복사

✍️ 스프레드 문법을 사용하면 slice 메서드를 사용한 것보다 간결하고 가독성 있게
원본 배열의 각 요소를 얕은 복사하여 새로운 복사본을 생성할 수 있다.

// ES6
const origin = [1, 2];
const copy = [...origin];

console.log(copy); // [1, 2]
console.log(copy === origin); // false

35.2.4 이터러블을 배열로 변환

✍️ 스프레드 문법을 사용하면 간편하게 이터러블을 배열로 변환할 수 있다.

function sum() {
  // 이터러블이면서 유사 배열 객체인 arguments를 배열로 변환
  return [...arguments].reduce((pre, cur) => pre + cur, 0);
}

console.log(sum(1, 2, 3)); // 6

단, 이터러블이 아닌 유사 배열 객체는 스프레드 문법의 대상이 될 수 없다.

이터러블이 아닌 유사 배열 객체를 배열로 변경하려면
ES6에서 도입된 Array.from 메서드를 사용한다.

💡 Array.from

Array.from 메서드는 유사 배열 객체 또는 이터러블을 인수로 전달받아
--> 배열로 변환하여 반환
한다.


35.3 객체 리터럴 내부에서 사용하는 경우

스프레드 프로퍼티를 사용하면 객체 리터럴의 프로퍼티 목록에서도 스프레드 문법을 사용할 수 있다!

스프레드 문법의 대상은 이터러블이어야 하지만,
--> 스프레드 프로퍼티일반 객체를 대상으로도 스프레드 문법의 사용을 허용한다!

// 스프레드 프로퍼티
// 이터러블 객체가 아닌 일반 객체 복사(얕은 복사)
const obj = { x: 1, y: 2 };
const copy = { ...obj };

console.log(copy); // {x: 1, y: 2}
console.log(obj === copy); // false

✍️ 스프레트 프로퍼티가 아닌 Objec.assign 메서드를 사용해서
--> 여러 개의 객체를 병합하거나 특정 프로퍼티를 변경 또는 추가할 수 있다!

// 객체 병합.
// 프로퍼티가 중복되는 경우 뒤에 위치한 프로퍼티가 우선권을 갖는다.
const marged = Object.assign({}, { x: 1, y: 2 }, { y: 10, z: 3 });
console.log(marged); // {x: 1, y: 10, z: 3}

// 특정 프로퍼티 변경
const changed = Object.assign({}, { x: 1, y: 2 }, { y: 100 });
console.log(changed); // {x: 1, y: 100}

// 프로퍼티 추가
const added = Object.assign({ x: 1, y: 2 }, { z: 0 });
console.log(added); // {x: 1, y: 2, z: 0}

스프레드 프로퍼티는 Object.assign 메서드를 대체할 수 있는 문법이다!

// 객체 병합.
// 프로퍼티가 중복되는 경우 뒤에 위치한 프로퍼티가 우선권을 갖는다.
const marged = { ...{ x: 1, y: 2 }, ...{ y: 10, z: 3 } };
console.log(marged); // {x: 1, y: 10, z: 3}

// 특정 프로퍼티 변경
const changed = { ...{ x: 1, y: 2 }, y: 100 };
console.log(changed); // {x: 1, y: 100}

// 프로퍼티 추가
const added = { ...{ x: 1, y: 2 }, z: 0 };
console.log(added); // {x: 1, y: 2, z: 0}
profile
천천히 운영되는 개발 블로그

0개의 댓글