간단 정리
shallowCopy ( 얕은 복사 - 기본값 ) : 단순 변수는 복사되고
오브젝트/배열에 대해서는 같은 메모리를 사용 (값을 바꾸면 기존 오브젝트/배열 값도 같이 바뀜)
deepCopy ( 깊은 복사 ) : 오브젝트/배열을 새로운 메모리에 할당 (값을 바꿔도 기존 오브젝트/배열 값과 무관)
간단한 얕은 복사 예시..
_ (lodash) 라는 좋은 라이브러리가 있습니다만 직접 구현해봤습니다. (왜 이런거에 관심이 있으까..ㅋ)

const DeepCopy = (target) => {
  //단순 변수는 그냥 반환
  if (!(target instanceof Object)) {
    return target;
  }
  //배열인 경우는 배열 순회 후 반환
  if (Array.isArray(target)) {
    let arr = [];
    for (let i = 0; i < target.length; ++i) {
      arr.push(DeepCopy(target[i]));
    }
    return arr;
  }
  let newValue = {};
  //오브젝트 형태인 경우 모든 키에 대해 순환 후 반환
  for (let key of Object.keys(target)) {
    if (target[key] instanceof Object) {
      // console.log("key : ", key, "target[key] : ", target[key]);
      if (Array.isArray(target[key])) {
        let arr = [];
        for (let i = 0; i < target[key].length; ++i) {
          arr.push(DeepCopy(target[key][i]));
        }
        newValue = {
          ...newValue,
          [key]: arr,
        };
      } else {
        newValue = {
          ...newValue,
          [key]: DeepCopy(target[key]),
        };
      }
    } else {
      // console.log("key : ", key, "target[key] : ", target[key]);
      newValue = { ...newValue, [key]: target[key] };
    }
  }
  return newValue;
};
const DeepCopyTest = () => {
  const origin1 = {
    a: 123,
    target: {
      b: 456,
      target2: [
        {
          c: 789,
          x: [123, 456, 789],
        },
      ],
    },
  };
  const shallowCopy1 = origin1;
  const deepCopy1 = DeepCopy(origin1);
  shallowCopy1.a = 3;
  origin1.target.target2[0].c = 54;
  origin1.target.target2[0].x[0] = 11111;
  origin1.target.b = 88;
  console.log("origin 1 : ", origin1);
  console.log("shallowCopy 1 : ", shallowCopy1);
  console.log("deepcopy 1 : ", deepCopy1);
  const origin2 = [
    {
      v1: 12,
    },
    {
      v2: 56,
      v3: [
        {
          v4: 123,
        },
        123123123123,
      ],
    },
  ];
  const shallowCopy2 = origin2;
  const deepCopy2 = DeepCopy(origin2);
  origin2[0].v1 = 43666;
  origin2[1].v3[0].v4 = 88;
  origin2[1].v3[1] = 543;
  console.log("origin 2 : ", origin2);
  console.log("shallowCopy 2 : ", shallowCopy2);
  console.log("deepcopy 2 : ", deepCopy2);
  return <></>;
};
export default DeepCopyTest;'React > 문법' 카테고리의 다른 글
| [React] 웹페이지 간의 통신 (window.open, window.opener.postMessage) (0) | 2023.11.05 | 
|---|---|
| [Crypto-js] AES256 사용 방법 (0) | 2023.10.31 | 



