// 이터러블이 아닌 일반 객체는 스프레드 문법의 대상이 될 수 없다. console.log(...{ a: 1, b: 2 }); // TypeError: Found non-callable @@iterator
// 스프레드 문법의 결과는 값이 아니다. const list = ...[1, 2, 3]; // SyntaxError: Unexpected token ...
쉼표로 구분한 값의 목록을 사용하는 문맥에서만 사용할 수 있다.
함수 호출문의 인수 목록
배열 리터럴의 요소 목록
객체 리터럴의 프로퍼티 목록
함수 호출문의 인수 목록에서 사용하는 경우
1 2 3 4 5 6 7 8
var arr = [1, 2, 3];
Math.max(arr); // -> NaN
// apply 함수의 2번째 인수(배열)는 apply 함수가 호출하는 함수의 인수 목록이다. // 따라서 배열이 펼쳐져서 인수로 전달되는 효과가 있다. // null인 이유는 어차피 Math.max가 정적 메소드이기 때문이다. 사실 아무거나 줘도 어차피 안 본다. var max = Math.max.apply(null, arr); // -> 3
스프레드 문법을 사용
1 2 3 4 5
const arr = [1, 2, 3];
// 스프레드 문법을 사용하여 배열 arr을 1, 2, 3으로 펼쳐서 Math.max에 전달한다. // Math.max(...[1, 2, 3])은 Math.max(1, 2, 3)과 같다. const max = Math.max(...arr); // -> 3
// 세 번째 인수 arr2를 해체하여 전달해야 한다. // 그렇지 않으면 arr1에 arr2 배열 자체가 추가된다. arr1.splice(1, 0, arr2);
// 기대한 결과는 [1, [2, 3], 4]가 아니라 [1, 2, 3, 4]다. console.log(arr1); // [1, [2, 3], 4]
/* apply 메서드의 2번째 인수(배열)는 apply 메서드가 호출한 splice 메서드의 인수 목록이다. apply 메서드의 2번째 인수 [1, 0].concat(arr2)는 [1, 0, 2, 3]으로 평가된다. 따라서 splice 메서드에 apply 메서드의 2번째 인수 [1, 0, 2, 3]이 해체되어 전달된다. 즉, arr1[1]부터 0개의 요소를 제거하고 그 자리(arr1[1])에 새로운 요소(2, 3)를 삽입한다. */ Array.prototype.splice.apply(arr1, [1, 0].concat(arr2)); console.log(arr1); // [1, 2, 3, 4]
const user = { firstName: "Ungmo", lastName: "Lee" };
// ES6 객체 디스트럭처링 할당 // 변수 lastName, firstName을 선언하고 user 객체를 디스트럭처링하여 할당한다. // 이때 프로퍼티 키를 기준으로 디스트럭처링 할당이 이루어진다. 순서는 의미가 없다. const { lastName, firstName } = user;
console.log(firstName, lastName); // Ungmo Lee
객체의 프로퍼티 키와 다른 변수 이름으로 프로퍼티 값을 할당받으려면 다음과 같이 변수를 선언한다.
1 2 3 4 5 6 7 8
const user = { firstName: "Ungmo", lastName: "Lee" };
// 프로퍼티 키를 기준으로 디스트럭처링 할당이 이루어진다. // 프로퍼티 키가 lastName인 프로퍼티 값을 ln에 할당하고, // 프로퍼티 키가 firstName인 프로퍼티 값을 fn에 할당한다. const { lastName: ln, firstName: fn } = user;