Object.assign vs Spread Syntax (...)

2024. 11. 20. 19:37·Stack/JavaScript
반응형

Object.assign 과 Spread Syntax (...) 둘 다 javascript에서 객체를 복사하거나 병합하는 방법이다.

나도 일반적으로 Spread 문법을 주로 사용하고 Object.assign에 대해서는 무지했는데, 이에 대해 알아보기 위해 글을 작성해본다.

Object.assign 사용예시

const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };

const obj = Object.assign(o1, o2, o3);

console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 목표 객체 자체가 변경됨.
console.log(o2); // { b: 2 };
console.log(o3); // { c: 3 };

Spread Syntax (...) 사용예시

const o1 = { a: 1 };
const o2 = { b: 2 };
const obj = { ...o1, ...o2 };

console.log(obj); // { a: 1, b: 2 } 

Object.assign 와 Spread Syntax (...) 차이점

사용예시에서 눈여겨볼 사항이 Object.assign 을 사용 이후 console.log 를 살펴보면 첫 번째 인자가 타겟 객체가된다. ****

console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 목표 객체 자체가 변경됨.

때문에 위에 o1의 값이 변화되는 결과를 볼 수 있다.

그 외의 문서에서 찾아본점은

  • Object.assign은 프로토타입 속성까지 복사한다. Spread syntax는 이를 제외한다.
  • Spread syntax는 배열에서도 사용이 가능하다. 반면Object.assign은 객체에 대해서만 동작하며, 배열에 사용할 경우 배열이 객체로 취급된다.

추가내용.

⇒ Object.assign으로 만들어진 배열의 경우, 외부적으로는 정상적인 배열처럼 보일 수 있다. 하지만 이는 객체형식으로 된 배열의 모양을 가지고 있다고 생각하면된다.

무엇이 문제냐고 한다면 사실 문제는 크게 없지만, 동일한 결과를 보이더라도, 배열 복사의 본질적 메커니즘에는 차이가 존재한다.

const arr = [1, 2, 3];

// Object.assign
const assignedArray = Object.assign([], arr);
assignedArray[5] = 99; // 인덱스 5에 값을 추가
console.log(assignedArray.length); // 6 (자동으로 늘어남)

// Spread Syntax
const spreadArray = [...arr];
spreadArray[5] = 99;
console.log(spreadArray.length); // 6

위 예제에서는 둘 다 length가 자동으로 늘어났다, 이는 JavaScript 엔진이 배열의 동작을 자동으로 보완했다. 실제로, Object.assign은 복사된 배열의 length를 수동으로 관리하지 않으면 예상치 못한 동작이 발생한다.

length와 배열 메서드의 불일치

const arr = [1, 2, 3];

// Object.assign
const assignedArray = Object.assign([], arr);

// 배열 메서드 호출 전 수동으로 length 수정
assignedArray.length = 1;

// Spread Syntax
const spreadArray = [...arr];
spreadArray.length = 1;

// 배열 메서드 적용
console.log(assignedArray.map((x) => x * 2)); // [2, NaN, NaN]
console.log(spreadArray.map((x) => x * 2));   // [2]

빈 배열을 처리할때의 발생하는 문제

const arr = [1, , 3]; // 희소 배열 (인덱스 1이 비어 있음)

// Object.assign
const assignedArray = Object.assign([], arr);
console.log(assignedArray); // [1, undefined, 3]

// Spread Syntax
const spreadArray = [...arr];
console.log(spreadArray); // [1, , 3] (빈 슬롯 유지)

// 배열 메서드 적용
console.log(assignedArray.map((x) => x * 2)); // [2, NaN, 6]
console.log(spreadArray.map((x) => x * 2));   // [2, <empty>, 6]

결론

새로운 객체를 생성하고 병합하는 작업에서는 Spread Syntax를 사용하는 것이 더 간결하고 직관적이다. 다만, 프로토타입 속성 복사가 필요하거나, 특정 객체를 직접 수정해야 하는 경우에는 Object.assign이 적합하다. 추가적으로 Spread Syntax는 배열의 구조와 특성을 정확히 유지하므로, 배열 복사 및 병합 작업에서는 Spread Syntax 를 사용하면된다.

반응형

'Stack > JavaScript' 카테고리의 다른 글

자바스크립트 javascript 2진수 8진수 16진수 변환  (1) 2021.10.08
'Stack/JavaScript' 카테고리의 다른 글
  • 자바스크립트 javascript 2진수 8진수 16진수 변환
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    코딩테스트
    React Hooks
    리액트네이티브
    hooks
    ReactHook
    react-native
    java
    react
    React-Native cli
    프로그래머스
    티스토리챌린지
    오블완
    백준
    ios
    react-native-maps
    SWEA
    javascript
    mongoDB Atlas
    reactnative
    코테준비
    Next.js
    코테
    error
    d1
    Expo
    mongodb cloud
    알고리즘
    boj
    D2
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
Object.assign vs Spread Syntax (...)
상단으로

티스토리툴바