반응형
✍깊은복사와 얕은 복사 관련 게시글
https://joyhong-91.tistory.com/41
[javascript] 변수 참조타입 메모리 접근 방식, 참조타입 복사가 필요한 이유 (shallow copy, deep copy)
목차 원시값, 참조값이란? 그리고 복사가 필요한 이유 얕은 복사의 정의와 방법 깊은 복사의 정의와 방법 들어가기전에! 자바스크립트 엔진은 가상머신으로 돌아가는데 버츄얼 머신 메모리 모
joyhong-91.tistory.com
✔1차원 배열, 1차원 객체는 복사를 하면 깊은 복사(deep copy)가 됩니다
복사한 객체를 수정하면 기존 객체에 영향 없습니다.
const arr1Dth = [1,2,3,4];
const obj1Dth = {key: 'key1', value: 'value1'};
const copyArr1Dth = [...arr1Dth];
copyArr1Dth[1] = 7;
console.log('origin', arr1Dth); //origin [ 1, 2, 3, 4 ]
console.log('copy', copyArr1Dth); //copy [ 1, 7, 3, 4 ]
const copyObj1Dth = {...obj1Dth};
copyObj1Dth.key = 'key7';
console.log('origin', obj1Dth); //origin { key: 'key1', value: 'value1' }
console.log('copy', copyObj1Dth); //copy { key: 'key7', value: 'value1' }
✔2차원 배열, 2차원 객체는 복사를 하면 얕은 복사(shallow copy) 가 됩니다
복사한 객체를 수정하면 기존 객체에도 영향을 끼칩니다.
const arr2Dth = [[1,2], [3,4]];
const obj2Dth = {key: {mainKey: 'mainKey1', subKey: 'subKey1'}};
const copyArr2Dth = [...arr2Dth];
copyArr2Dth[1][0] = 7;
console.log('origin', arr2Dth); // origin [ [ 1, 2 ], [ 7, 4 ] ]
console.log('copy', copyArr2Dth); // copy [ [ 1, 2 ], [ 7, 4 ] ]
const copyObj2Dth = {...obj2Dth};
copyObj2Dth.key.mainKey = 'mainKey7';
console.log('origin', obj2Dth); // origin { key: { mainKey: 'mainKey7', subKey: 'subKey1' } }
console.log('copy', copyObj2Dth); // copy { key: { mainKey: 'mainKey7', subKey: 'subKey1' } }
✔2차원 배열, 2차원 객체 깊은 복사(deep copy ) 하는 방법
- JSON.parse(JSON.stringify(복사할 object))
- JSON.stringify()로 객체를 json 문자열로 변환하는데 이 과정에서 원본 객체의 참조가 모두 끊어집니다.
- 장점: 구현하기 간단하고 쉽습니다.
- 단점
- 다른 방법에 비해 느립니다..
- 객체가 함수일 경우 undefined로 처리합니다.
- 모든 데이터가 복사되지 않거나 타입이 변경될 수도 있는 문제가 있습니다.
- Lodash 라이브러리 _.clonedeep 사용하기
- 반복문 & 재귀함수로 구현
반응형
'내직업은 IT종사자 > javascript' 카테고리의 다른 글
ealry return 은 좋은 것일까? (0) | 2024.05.08 |
---|---|
블로킹(Blocking)과 논블로킹(Non-blocking) 그리고 동기(synchronous) 과 비동기(asynchronous)의 정의 및 차이점 (헷갈리지않기!) (2) | 2024.05.01 |
쿠키, 세션, 웹 스토리지 차이 (cookie, session, web storage) (0) | 2023.07.01 |
[javascript] lodash.js 와 native 속도 차이, 그래도 lodash를 사용하는 이유 (0) | 2023.06.22 |
[javascript] javascript engine 이벤트 루프(Event Loop) 와 틱(tick) (0) | 2023.06.05 |