πŸ“’ 얕은 볡사와 κΉŠμ€ 볡사

zooyahoΒ·2022λ…„ 7μ›” 16일
0
post-thumbnail
post-custom-banner

얕은 볡사와 κΉŠμ€ 볡사

객체λ₯Ό ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ κ°–λŠ” 객체의 경우 얕은 λ³΅μ‚¬λŠ” ν•œ λ‹¨κ³„κΉŒμ§€λ§Œ λ³΅μ‚¬ν•˜λŠ” 것을 λ§ν•˜κ³  κΉŠμ€ λ³΅μ‚¬λŠ” 객체에 μ€‘μ²©λ˜μ–΄ μžˆλŠ” κ°μ²΄κΉŒμ§€ λͺ¨λ‘ λ³΅μ‚¬ν•˜λŠ” 것을 λ§ν•œλ‹€.

πŸ’‘ μ—¬κΈ°μ„œ λ³΅μ‚¬λŠ” 참쑰값을 μƒˆλ‘œ μƒμ„±ν•˜μ—¬ ν• λ‹Ήλ˜λŠ” 것을 λ§ν•œλ‹€.
πŸ’‘ 얕은 볡사와 κΉŠμ€ λ³΅μ‚¬λ‘œ μƒμ„±λœ κ°μ²΄λŠ” μ›λ³Έκ³ΌλŠ” λ‹€λ₯Έ 객체닀! 즉, 원본과 볡사본은 μ°Έμ‘° 값이 λ‹€λ₯Έ λ³„κ°œμ˜ 객체닀!!

● 얕은 볡사(shallow copy)

πŸ‘Ύ#01 - μ „κ°œμ—°μ‚°μž μ‚¬μš©

const obj = { x: { y: 1 } };
const c1 = {...obj}; // μŠ€ν”„λ ˆλ“œ 문법

console.log(c1 === obj); // false
console.log(c1 == obj); // false
console.log( c1.x === obj.x ); // true
c1.x.y = 10;
console.log(obj.x.y); // 10

πŸ’‘ 객체에 μ€‘μ²©λ˜μ–΄ μžˆλŠ” 객체의 경우 μ°Έμ‘°κ°’λ§Œ λ³΅μ‚¬ν•œλ‹€!! 객체에 μ€‘μ²©λ˜μ–΄ μžˆλŠ” κ°μ²΄κΉŒμ§€ λ³΅μ‚¬ν•˜μ§€ λͺ»ν•΄ μ€‘μ²©λ˜μ–΄μžˆλŠ” 객체의 μ£Όμ†Œκ°€ κ°™μŒ.

πŸ‘Ύ#02 - Object.assign() λ©”μ„œλ“œ μ‚¬μš©

const obj = {
  a: 1,
  b: {
    c: 2,
  },
};

const copydObj = Object.assign({}, obj);

copydObj.b.c = 3
console.log(obj.b.c); // 3
obj === copydObj // false

πŸ‘Ύ#03 - λ°°μ—΄μ—μ„œ 얕은 볡사, slice()λ©”μ„œλ“œ

  • 원본 λ°°μ—΄ μˆ˜μ • μ•ˆλ¨.
const items = ['a', 'b', 'c'];
// λͺ¨λ“  μš”μ†Œλ₯Ό λ°˜ν™˜ (= 볡사본(shallow copy) 생성)
res = items.slice();
console.log(res);  // [ 'a', 'b', 'c' ]
const todos = [
  { id: 1, content: 'HTML', completed: false },
  { id: 2, content: 'CSS', completed: true },
  { id: 3, content: 'Javascript', completed: false }
];

// shallow copy
const _todos = todos.slice();
// const _todos = [...todos];
console.log(_todos === todos); // false

// λ°°μ—΄μ˜ μš”μ†ŒλŠ” κ°™λ‹€. 즉, 얕은 λ³΅μ‚¬λ˜μ—ˆλ‹€.
console.log(_todos[0] === todos[0]); // true

● κΉŠμ€ 볡사(deep copy)

πŸ’‘ 객체에 μ€‘μ²©λ˜μ–΄ μžˆλŠ” κ°μ²΄κΉŒμ§€ λͺ¨λ‘ λ³΅μ‚¬ν•΄μ„œ μ›μ‹œ κ°’μ²˜λŸΌ μ™„μ „ν•œ 볡사본을 λ§Œλ“ λ‹€!!

πŸ‘Ύ#01 Lodash의 cloneDeep을 μ‚¬μš©

const obj = { x: { y: 1 } };
const _ = require('lodash'); // import _ from 'lodash';
const c2 = _.cloneDeep(obj);

console.log(c2 === obj); // false
console.log( c2.x === obj.x ); // false
profile
즐겁게 κ°œλ°œν•˜μž μ₯¬μ•Όν˜ΈπŸ‘»
post-custom-banner

0개의 λŒ“κΈ€