โจ Object ๋?
Javascript์ Reference type (๊ฐ์ฒด/์ฐธ์กฐํ ํ์ ) ์ ์ํ๋ Data type ์ด๋ค.
ํ๊ตญ์ด๋ก๋ '๊ฐ์ฒด'๋ก ๋ถ๋ฆฌ์ฐ๋ฉฐ, key ์ value ๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๊ฐ์ฒด๋ Heap ๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋๋ฉฐ, ๋ณ์์๋ ํด๋น ๊ณต๊ฐ์ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ด ํ ๋น๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด ๋ณ์์ ๊ฐ์ฒด ๋ณ์ ์์ฒด๋ฅผ ํ ๋นํ ๊ฒฝ์ฐ ๊ฐ์ฒด ์์ฒด์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉฐ, ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ์ฃผ์๋ง ๋ณต์ฌ๋๋ค.
// ์ฐธ์กฐ ํ ๋น: ์๋ก ๋ค๋ฅธ ๋ณ์๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋จ
let obj = {0:'zero', 1:'one'}
let obj1 = obj // obj์ ๊ฐ์ฒด ์ฃผ์๊ฐ ๋ณต์ฌ๋จ
obj1.1 = 'changed one' // obj1 ์์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๋ฉด
obj // {0:'zero', 1:'changed one'}
// obj ์์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โจ Light(Shallow) Copy ๋?
๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๋ณ์๋ก ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. Object.assign()
๋๋ Spread Operator ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์์๋ Object.assign()
์ ํ์ฉํ์ฌ ์์ฑํด๋ณธ๋ค.
let obj = { a: 1, b: 2} // ์ถ์ฒ ๊ฐ์ฒด
let target = { c: 3 } // ๋์ ๊ฐ์ฒด
let newobj = Object.assign(target, obj)
newobj // { c: 3, a: 1, b: 2 }
์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์ ์ ๊ฐ์ฒด์ ์์ ํ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
let obj = { a: 1, b: 2, c: {d:3, e:4}} // ์ถ์ฒ ๊ฐ์ฒด
let newobj = Object.assign({}, obj) // ์ถ์ฒ ๊ฐ์ฒด๋ฅผ ๋น ๊ฐ์ฒด์ ๋ณต์ฌํด์ค๋ค
obj.a = 100 // ์๋ณธ ๊ฐ์ฒด์ ์์ฑ๊ฐ ๋ณ๊ฒฝ
obj.c.d = 300 // ์๋ณธ ๊ฐ์ฒด์ ์์ฑ๊ฐ ๋ณ๊ฒฝ
newobj.a // 1
newobj.c.d // 300
์ด์ฒ๋ผ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํด๋น key ์๋ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ ํ ๋น๋๋ค.
์ฐธ๊ณ )
MDN ์ค๋ช : “For deep cloning, we need to use alternatives because Object.assign() copies property values. If the source value is a reference to an object, it only copies that reference value.”
โจ Deep Copy ๋?
์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก, ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ์์ด ๊ณ ์ ๊ฐ๋ง ์ ๋ถ ๋ณต์ฌํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค.
JSON.stringify ์ JSON.parse ๋ฅผ ํ์ฉํ๋ฉด Deep copy ๋ฅผ ์ํํ ์ ์๋ค.
JSON.Stringify ๋ ๋ฐ์์จ iterable ์ String์ผ๋ก ๋ณํํ๋ฉฐ, JSON.parse ๋ ๋ณํ๋ ๋ฌธ์๋ฅผ ๋ค์ ๊ฐ์ฒด๋ก ๋๋๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
let obj = { a: 1, b: 2, c: {d:3, e:4}}
let newobj = JSON.parse(JSON.stringify(obj))
// ๋ณํ ์ ์ด์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ง
obj.a = 100 // ์๋ณธ ๊ฐ์ฒด์ ์์ฑ๊ฐ ๋ณ๊ฒฝ
obj.c.d = 300 // ์๋ณธ ๊ฐ์ฒด์ ์์ฑ๊ฐ ๋ณ๊ฒฝ
newobj.a // 1
newobj.c.d // 3
์ด ๋ฐฉ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ์กด์ฌํ๋ค.
- BigInt (ECMA 2020 ๋์ ) ์ ์ฒ๋ฆฌํ ์ ์๋ค. (์๋ฌ ๋ฐํ)
- Date์ ๊ฐ์ ๊ฐ์ฒด๋ Stringify ์ ์ฉ ์ ๋ณด์ฌ์ง๋ ๋ฐฉ์๋ ๋ณํํ๋ค.
- ํจ์, ์ ๊ทํํ์, Infinity ๋ฑ์ ๋ฐ์ดํฐ ์ญ์ ๋ณํ์ด ์ ๋๋ค.
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋นํด ์๋๊ฐ ๋๋ฆฌ๋ค.
โจ Lodash
Lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ cloneDeep() ๋ฉ์๋๋ฅผ ํตํด Deep Copy ๋ฅผ ํ ์ ์๋๋ก ์ง์ํ๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด ์์ฝ๊ฒ Deep Copy ๋ฅผ ํ ์ ์๋ค.
import * as _ from 'lodash'
const object1 = { a: 1, b: 2 };
const object2 = \_.cloneDeep(object1);
object2.a = 100; console.log(object2.a); //100 console.log(object2.b); //2
์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ธ์๋ ์ง์ for ๋ฌธ์ ๋๋ฆฌ๋ฉฐ ์๋ก์ด ๊ฐ์ฒด์ ๋ณต์ฌ๋ฅผ ํด์ค ์ ์๋ค.
โจ ๋ง๋ฌด๋ฆฌ
Deep Copy ๋ผ๊ณ ๋ฌด์กฐ๊ฑด ์ข์ ๊ฒ์ ์๋๋ฉฐ, Shallow Copy ๋ผ๊ณ ๋ฌด์กฐ๊ฑด ๊ธฐํผํด์ผ ํ ๊ฒ์ ์๋๋ค. ์ฝ๋์ ๋ชฉ์ ๊ณผ ๊ฐ์ฒด์ ์ฉ๋์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
์ฐธ๊ณ ์๋ฃ
๊น์ ๋ณต์ฌ์ ์์ ๋ณต์ฌ์ ๋ํ ์ฌ๋์๋ ์ด์ผ๊ธฐ
'๐ป DEV > Javascript & NodeJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] Async ํจ์์ Await (0) | 2021.05.27 |
---|---|
[Javascript] Promise (ํ๋ก๋ฏธ์ค) (0) | 2021.05.27 |
[Javascript] ๋น๋๊ธฐ, ๋๊ธฐ ํจ์ (Asynchronous, Synchronous) ๋? (0) | 2021.05.27 |
[Javascript] Class (0) | 2021.05.13 |
[Javascript] ํจ์ : Currying (์ปค๋ง) (0) | 2021.05.09 |
๋๊ธ