Search

32장 스프레드 문법

대분류
언어
서적
소분류
JS DeepDive
태그
...
객체리터럴
배열리터럴
최종 편집 일시
2024/10/27 15:39
생성 일시
2024/02/08 00:16
14 more properties

스프레드 문법

ES6에서 도입
하나로 뭉쳐 있는 여러 값들의 집합을 펼쳐서 개별적인 값들의 목록으로 생성
스프레드 문법의 대상은 for ... of 문으로 순회할 수 있는 이터러블에 한정
... 은 피연산자를 연산하여 값을 생성하는 연산자가 아닌 값들의 목록 표시
아래와 같이 쉼표로 구분한 값의 목록을 사용하는 문맥에서만 사용 가능
함수 호출문의 인수 목록
배열 리터럴의 요소 목록
객체 리터럴의 프로퍼티 목록

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

Math.max(...arr);
TypeScript
복사
이전에는 이것과 동일한 연산을 하기 위해 Function.prototype.apply를 사용하여 배열을 2 번째 인수에 전달하여 요소들의 목록을 제공하였다.
rest 파라미터의 경우 인수들의 목록을 배열로 전달받기 위해 매개변수 이름 앞에 ...을 붙임
스프레드 문법은 뭉쳐있는 배열과 같은 이터러블을 펼쳐서 개별적인 값들의 목록을 만듦
-> 서로 반대의 개념(Rest vs 스프레드)

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

스프레드 문법 사용 시, ES5에서 사용하던 기존 방식보다 더욱 간결하고 가독성 좋게 표현 가능

concat

// ES5 var arr = [1, 2].concat([3, 4]); console.log(arr); // [1, 2, 3, 4] // ES6 const arr = [...[1, 2], ...[3, 4]]; console.log(arr); // [1, 2, 3, 4]
TypeScript
복사

splice

전에는 배열을 해체하기 위해 Function.prototype.apply 메서드를 사용하여 splice 메서드 호출
// ES6 스프레드 문법 const arr1 = [1, 4]; const arr2 = [2, 3]; arr1.splice(1, 0, ...arr2); console.log(arr1); // [1, 2, 3, 4]
TypeScript
복사

배열 복사

전에는 slice 메서드 사용
// ES6 const origin = [1, 2]; const copy = [...origin]; console.log(copy); // [1, 2] console.log(copy === origin); // false
TypeScript
복사

이터러블을 배열로 변환

이터러블을 배열로 변환하려면 Function.prototype.apply 또는 Function.prototype.call 메서드를 사용하여 slice 메서드를 호출함 --> 이터러블뿐만 아니라 유사 배열 객체도 배열로 변환 가능
arguments 객체를 스프레드 문법을 사용하여 간단하게 배열로 변환 가능 --> [...arguments]
더 나은 방법은 Rest 파라미터 이용
const sum = (...args) => args.reduce((pre, cur) => pre + cur, 0); console.log(sum(1, 2, 3,)); // 6
TypeScript
복사
이터러블이 아닌 유사 배열 객체는 스프레드 문법의 대상이 될 순 없다. --> 유사배열 객체를 Array.from 메서드를 사용해 배열로 반환하여 사용

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

stage 4 단계에 제안이 되어있는 스프레드 프로퍼티를 사용하면 객체 리터럴의 프로퍼티 목록에서도 스프레드 문법을 사용 가능
스프레드 프로퍼티 전에는 ES6에서 도입된 Object.assign 메서드를 사용하여 여러개의 객체 병합
// 객체 병합. 프로퍼티가 중복되는 경우 뒤에 위치한 프로퍼티가 우선권 소유 const merged = { ... { x:1, y:2 }, ... { y:10, z:3} }; console.log(merged); // { 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 }
TypeScript
복사