티스토리 뷰
안녕하세요!
좋아요요정입니다 :) 오늘은 object 깊은 복사를 진행했습니다.
테이블에 입력되는 column을 복제해서 일부 값을 수정하고 반환 수정하는데 setState를 선언하지 않았음에도 변경되었습니다.
이유는 { ... } 은 shallow copy를 하기 때문!
const object = {
a: 'aa',
b: 'bb',
c: ['c','cc']
}
const copy = { ...object }
이 경우, object에는 데이터가 저장되는 것이 아니라 데이터의 값을 가리키는 참조값이 저장됩니다.
그 참조값을 복사해 데이터를 수정하니, 결국 그 내부의 값이 변경된 것입니다.
복사 전 변수도, 복사한 변수도 결국 같은 데이터를 가리키고 있던 것이죠.
깊은 복사하는 방법1
- JSON객체를 이용하는 방법
const cloneObject = (obj) => {
return JSON.parse(JSON.stringify(obj)
}
- JSON은 텍스트로 변환되기 때문에 이 경우 텍스트가 아닌 경우 문제가 발생합니다.
깊은 복사하는 방법2 ⭐️
- 배열, 오브젝트를 대응할 수 있는 함수
function cloneObject(obj) {
let clone = {};
for(let i in obj) {
if(typeof(obj[i])=="object" && obj[i] != null) {
if(Array.isArray(obj[i])) {
clone[i] = [];
for(let k in obj[i]) {
clone[i][k] = JSON.parse(JSON.stringify(obj[i][k]));
}
} else {
clone[i] = cloneObject(obj[i]);
}
} else {
let j = Object.getOwnPropertyDescriptor(obj, i);
clone[i] = j.value
}
}
return clone;
}
- 오브젝트 내부의 배열이 object로 찍혀서 당황했습니다.(왜 그런지 아시는분? 참조값이 연결되어있다는 뜻인가요?)
- isArray()로 배열여부를 체크하고 배열을 복사했습니다.
- object가 아닌 경우에는 Object.getOwnPropertyDescriptor() 를 이용해 value값을 복사했습니다.
오늘도 하나 해결!
크으 뿌듯하네요..
올해가 얼마 남지 않았습니다. :) 남은 목표들 이루시는 올해되시길 바랍니다!
이상 좋아요요정이었습니다. 행복한 코딩라이프되세요!
'개발일기' 카테고리의 다른 글
프론트엔드 면접을 대비하여 지식 요약3 (Network 관련) (0) | 2022.03.10 |
---|---|
프론트엔드 면접을 대비하여 지식 요약2(JavaScript 관련) (0) | 2022.03.10 |
프론트엔드 면접을 대비하여 지식 요약1 (Programming용어 관련) (0) | 2022.03.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 타이핑
- 코딩테스트
- react
- 타이핑효과
- this
- JS
- 메서드
- Call
- 프론트엔드
- 생성자함수
- 면접대비
- 객체
- 프로그래머스
- SET
- 리액트
- 스택
- 선언
- 프로퍼티
- 자바스크립트
- 면접
- 함수
- Prototype
- 스터디
- JavaScript
- 파이썬
- Python
- 복제
- 팀러버덕
- 상속
- 프로토타입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함