JavaScript

[자바스크립트] 스프레드 문법

문승주 2023. 10. 3. 17:50
반응형

 내용은 이웅모 님의 "모던 자바스크립트 DeepDive" 책을 보고 정리한 내용입니다. 저작권 보호를 위해 책의 내용은 요약되었습니다.

 

스프레드 문법이란?

  • ES6에서 도입된 스프레드 문법(Spread Syntax)은 배열과 객체를 확장하거나 병합할 때 사용되는 문법이다.
  • 스프레드 문법은 ... 연산자를 사용하여 구현되며, 배열의 요소를 분해하여 개별적인 값들의 목록을 만들거나 객체의 프로퍼티를 복사하거나 병합하는 등의 작업에 사용된다.

예시) 스프레드 문법

const array = [1,2,3,4,5]
const string = "sjmoon";
const map = new Map([['a',1], ['b',2], ['c',3]])
const set = new Set([1,2,3,4,5]);
const object = {a:1, b:2, c:3};

// 배열, 문자열, map, set 은 이터러블이다.
console.log(...array); // 출력 : 1 2 3 4 5
console.log(...string); // 출력 : s j m o o n
console.log(...map); // 출력 : [ 'a', 1 ] [ 'b', 2 ] [ 'c', 3 ]
console.log(...set); // 출력 : 1 2 3 4 5
// 이터러블이 아닌 일반객체는 스프레드 문법의 대상이 아니다.
console.log(...object); // TypeError: Spread syntax requires ...iterable[Symbol.iterator] to be a function

 

스프레드 문법을 사용하는 경우

  • 함수 호출문의 인수 목록
  • 배열 리터럴의 요소 목록
  • 객체 리터럴의 프로퍼티 목록 

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

  • 요소들의 집합인 배열을 개별적인 값들의 목록으로 만들고, 함수의 인수 목록으로 전달해야 하는 경우 스프레드 문법을 사용하면 간결하고 가독성이 좋다.
  • Rest 파라미터와 형태는 스프레드 문법가 동일하지만 함수에 전달된 인수들의 목록을 배열로 전달받기 위해 사용되므로 반대의 개념이다.

예시)

const array = [1,2,3,4,5];

// 숫자가 아닌 배열이 인수이면 최댓값을 구할 수 업으므로 NaN을 출력한다.
console.log(Math.max(array)); // 출력 : 

// Function.prototype.apply 을 사용하여 배열을 개별적인 값들의 목록으로 만든다.
console.log(Math.max.apply(null, array)); // 출력 : 5

// 스프레드 문법을 사용하여 array를 개별적인 값들의 목록으로 만들고 최댓값을 구한다.
console.log(Math.max(...array)); // 출력 :

 

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

스프레드 문법을 배열 리터럴 내부에서 사용하면 ES6 이전 방식보다 간결하고 가독성이 좋게 표현할 수 있다.

 

예시) concat 메서드를 사용하여 2개의 배열을 1개로 결합한다.

let arr1 = [1,2,3];
let arr2 = [4,5,6];

// concat 메서드 사용
console.log(arr1.concat(arr2)); // 출력 : [ 1, 2, 3, 4, 5, 6 ]

// 스프레드 문법 사용
console.log([...arr1, ...arr2]); // 출력 : [ 1, 2, 3, 4, 5, 6 ]

 

예시) splice 메서드를 사용하여 arr1 배열의 2번째 인덱스부터 2개의 요소를 제거하고 arr2를 추가한다.

let arr1 = [1,2,0,0];
let arr2 = [3,4];

// arr1 배열의 2번째 인덱스부터 2개의 요소를 제거하고 arr2 추가

// splice 메서드 사용 
Array.prototype.splice.apply(arr1, [2,2].concat(arr2))
console.log(arr1); // 출력 : [ 1, 2, 3, 4 ]

// 배열값 초기화
arr1 = [1,2,0,0];
arr2 = [3,4];

// 스프레드 문법 사용
arr1.splice(2,2,...arr2);
console.log(arr1); // 출력 : [ 1, 2, 3, 4 ]

 

예시) slice메서드를 사용하여 배열을 복사한다.

const arr1 = [1,2,3];

// slice 메서드 사용
let arr2 = arr1.slice();
console.log(arr2); // 출력 : [ 1, 2, 3 ]

// 스프레드 문법 사용
arr2 = [...arr1];
console.log(arr2); // 출력 : [ 1, 2, 3 ]

 

예시) Function.prototype.call 메서드를 사용하여 유사배열 객체를 배열로 변환한다.

// slice.call 메서드 사용
function sum1() {
    // 유사 배열 객체인 arguments를 배열로 변환
    const args = Array.prototype.slice.call(arguments);
    // reduce 배열을 순환하며 인수로 전달받은 콜백함수를 반복 호출
    return args.reduce((x,y) => x+y,0);
}
console.log(sum1(1,2,3,4,5)) // 출력 : 15

// 스프레드 문법 사용
function sum2(){
    return [...arguments].reduce((x,y) => x+y,0);
}
console.log(sum2(1,2,3,4,5)) // 출력 : 15

// rest 파라미터 사용
const sum3 = (...args) => args.reduce((x,y) => x + y, 0);
console.log(sum3(1,2,3,4,5)); // 출력 : 15

 

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

  • 객체 리터럴의 프로퍼티 목록에서 스프레드 문법을 사용하려면 TC39 프로세스의 stage 4단계에 제안되어 있는 스프레드 프로퍼티를 사용하면 된다.
  • 스프레드 프로퍼티 제안일반 객체 대상으로도 스프레드 문법을 사용할 수 있다.

예시) Object,assign 메서드를 사용하여 객체를 병합한다.

const object1 = { a:1, b:2 };
const object2 = { b:2, c:3 };

// Object.assign 메서드를 사용하여 객체를 병합
// 프로퍼티가 중복되는 경우 뒤에 위치한 프로퍼티가 우선이다.
const merge1 = Object.assign({},object1,object2);
console.log(merge1); // 출력 : { a: 1, b: 2, c: 3 }

// 스프레드 문법 사용하여 프로퍼티 추가
// 프로퍼티가 중복되는 경우 뒤에 위치한 프로퍼티가 우선이다.
const merge3 = {...object1, ...object2};
console.log(merge3); // 출력 : { a: 1, b: 2, c: 3 }

 

반응형