Web/JavaScript

[JavaScript] 모던 자바스크립트 Deep Dive 35장 - 스프레드 문법

어징베 2023. 2. 8. 17:55


스프레드 문법의 결과는 값이 아니다. 따라서 문법의 결과는 변수에 할당할 수 없다.

const list = ...[1, 2, 3]; // SyntaxError: Unexpected token ...

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

const arr = [1, 2, 3];

const max = Math.max(arr); // NaN

const max2 = Math.max(...arr); // 3

Rest 파라미터와 스프레드 문법의 차이점

// Rest 파라미터는 인수들의 목록을 배열로 전달받는다.
function foo(...rest){
    console.log(rest); // 1, 2, 3 -> [1, 2, 3]
}

// 스프레드 문법은 배열과 같은 이터러블을 펼쳐서 개별적인 값들의 목록을 만든다.
// [1, 2, 3] -> 1, 2, 3
foo(...[1, 2, 3]);

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

스프레드 문법을 배열 리터럴에서 사용하면 기존의 방식보다 더욱 간결하고 가독성 좋게 표현할 수 있다.

 

- concat

// ES5
var arr = [1, 2].concat([3, 4]);
console.log(arr); // [1, 2, 3, 4]

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

- splice

// ES5
var arr1 = [1, 4];
var arr2 = [2, 3];
Array.prototype.splice.apply(arr1, [1, 0].concat(arr2));
console.log(arr1); // [ 1, 2, 3, 4 ]

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

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

- 배열복사

// ES5
var origin = [1, 2];
var copy = origin.slice();

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

// ES6
const origin = [1, 2];
const copy = [...origin]; // 이때 원본 배열의 각 요소를 얕은 복사하여 새로운 복사본을 생성한다. slice도 마찬가지

console.log(copy);
console.log(origin === copy); // false

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

// 스프레드 프로퍼티
// 객체 복사(얕은 복사)
const obj = { x: 1, y: 2 };
const copy = { ...obj };
console.log(copy); // { x: 1, y: 2 }
console.log(obj === copy); // false

// 객체 병합
const merged = { x: 1, y: 2, ...{ a: 3, b: 4}};
console.log(merged); // { x: 1, y: 2, a: 3, b: 4 }

// 특정 프로퍼티 변경
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 }