728x90
반응형

via GIPHY

 

얕은 복사(shallow copy)

 

변수가 가리키는 주소값이 같은 주소 값을 가리킬때 얕은 복사가 이루어진다고 한다.

reference type을 복사할때 얕은 복사가  이루어진다.

const a = { c: 'c' }
const b = a
b.c = 'd'

console.log(a) // { c: 'd' }
console.log(b) // { c: 'd' }
console.log(Object.is(a,b)) // true

 

spread를 통한 복사는 1 depth 까지만 깊은복사가 이루어진다.

const a = { b: { c: 'c' }, e: 'e' }
const b = {...a}

console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'e' }


b.e = 'd'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'd' }

b.b.c = 'z'
console.log(a) // { b: { c: 'z' }, e: 'e' }
console.log(b) // { b: { c: 'z' }, e: 'd' }

위의 코드를 보면 1depth인 e 값을 바꾸면 b의 값만 바뀌지만 

key 값이 b의 c의 값을 바꾸면 a 변수의 값도 바뀌어 버린다.

1 depth 까지만 깊은 복사가 이루어 지는 것이다.

 

Object.assign을 통한 복사 또한 1 depth 까지만 깊은 복사가 이루어진다.

const a = { b: { c: 'c' }, e: 'e' }
const b = Object.assign({}, a)

console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'e' }


b.e = 'd'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'd' }

b.b.c = 'z'
console.log(a) // { b: { c: 'z' }, e: 'e' }
console.log(b) // { b: { c: 'z' }, e: 'd' }

 


깊은 복사(deep copy)

원시 타입의 복사는 기본적으로 깊은 복사이다.

const a = 'a'
const b = a

원시타입을 복사하게 되면 b 변수에는 새로운 주소에 같은 값이 할당된다

 

깊은 복사를 하기 위해서는

 

커스텀 함수를 사용하거나 

const deepCopy = (target, temp) => {
  for (let key in target) {
  	if (typeof target[key] === 'object') {
      deepCopy(target[key], temp[key] = {})
    } else {
      temp[key] = target[key]
    }
  }
  return temp;
}

const a = { b: { c: 'c' }, e: 'e' }
const b = deepCopy(a, {})

console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'e' }


b.e = 'd'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'd' }

b.b.c = 'z'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'z' }, e: 'd' }

라이브러리를 사용하거나 (ex. lodash의 deep copy)

 

JSON.parse(Json.Stringify(Object))) 를 사용한다.

const a = { b: { c: 'c' }, e: 'e' }
const b = JSON.parse(JSON.stringify(a))

console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'e' }


b.e = 'd'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'c' }, e: 'd' }

b.b.c = 'z'
console.log(a) // { b: { c: 'c' }, e: 'e' }
console.log(b) // { b: { c: 'z' }, e: 'd' }
728x90
반응형

'Frontend > Javascript' 카테고리의 다른 글

Javascript 함수 => 1급 객체 ❓  (0) 2022.04.01
Javascript event loop  (1) 2022.03.31
Javascript Polyfill  (0) 2022.03.26
Javascript strict mode  (0) 2022.03.25
Javascript 화살표 함수  (0) 2022.03.25

+ Recent posts