Shallow copy 

  • 얕은 복사는 객체내의 객체를 복사할 때 주소값만을 복사하여 객체 내의 객체를 변경했을 경우 원본과 사본이 같이 고쳐지는 복사를 의미한다.
let arr = [1, 2, ["a", "b"]]
let newArr = arr.slice();

arr[0] = "가"
console.log(arr) //[ '가', 2, [ 'a', 'b' ] ]
console.log(newArr) //[ 1, 2, [ 'a', 'b' ] ]

arr[2][0] = 3;
console.log(arr) //[ '가', 2, [ 3, 'b' ] ]
console.log(newArr) //[ 1, 2, [ 3, 'b' ] ]



let obj = {
  job: 'manager',
  person: {
    name: 'hwang',
    age: '???'
  }
}

let newObj = Object.assign({}, obj)

obj.job = 'singer'

console.log(obj.job) //'singer'
console.log(newObj.job) //'manager'


obj.person.age = 20

console.log(obj.person.age) //20
console.log(newObj.person.age) //20

 

Deep Copy

  • 깊은 복사를 하는 방법은 직접 재귀함수를 사용하여 복사하는 방법과 JSON객체의 메소드를 이용하는 방법이 있다.
  • JSON.stringify: JS 오브젝트를 스트링 포맷으로 변환
  • JSON.parse: 스트링 포맷을 JS 오브젝트로 변환
  • JSON객체의 메소드 방법으로는 함수, Date 객체, 정규표현식 등등의 데이터는 복사되지 않는다.
//재귀함수를 이용한 Deep Copy

let obj = {
  name: 'hwnang',
  char: {
    job: 'swordman',
    level: 12,
    skill: ''
  },
  lastName: 'minhwan'
}

function cloneObj(pm){
  let newObj = {}
  for(let prop in pm){
    if(typeof pm[prop] === 'object' && pm[prop] !== null){
      newObj[prop] = cloneObj(pm[prop])
    }
    else {
      newObj[prop] = pm[prop]
    }
  }
  return newObj
}

cloneObj(obj)

'학습' 카테고리의 다른 글

compose 추상화  (0) 2021.08.10
map, filter, reduce  (0) 2021.08.10
구조 분해 할당  (0) 2021.08.05
Spread / Rest 문법  (0) 2021.08.05
Closure  (0) 2021.08.04