๊ฐ์ฒด ๋ถ๋ณ์ฑ์ด๋?
immutability = ๋ณํ๊ฐ๋ฅํ์ง ์์
๐ ๋ฐ์ดํฐ์ ์๋ณธ์ด ํผ์๋๋ ๊ฒ์ ๋ง๋๋ค.
<์์๋ฐ์ดํฐํ์ > => ๋ถ๋ณ (immutability), ํ์ํ ๋๋ง ์๋ก ๋ง๋ ๋ค.
- String
- Number
- Boolean
- Null
- Undefined
- Symbol
<๊ฐ์ฒด> => ๊ฐ๋ณ (mutability), ์์ฑํ ๋๋ง๋ค ์๋ก ๋ง๋ ๋ค.
- Object
- Array
- Function
let p1 = 1;
let p2 = 1;
console.log(p1, p2, p1 === p2);
// 1,1,true
// ์์๋ฐ์ดํฐ ํ์
์ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ณณ์ ๊ฐ๋ฆฌ์ผ์ true๋ค.
let o1 = {name:'hailie'}
let o2 = {name:'hailie'}
console.log(o1, o2, o1 === o2);
// {name:'hailie'}, {name:'hailie'}, false
// ๊ฐ์ ๊ฐ์ง๋ง ์๋ก ๋ณ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ false์ด๋ค.
let o3 = o1;
o3.name = 'coco'
console.log('o3:',o3, 'o1:',o1)
// o3: {name: 'coco'} o1: {name: 'coco'}
// o3์ value๋ฅผ ๋ฐ๊ฟจ์ง๋ง ๋ณธ์์๋๊ฒ o1์ value๊น์ง ๋ฐ๊ฟ๋ฒ๋ ธ๋ค!
let o1 = {name:'hailie'}
let o2 = {name:'hailie'}
let o3 = o1;
o3.name = 'coco'
console.log('o3:',o3, 'o1:',o1)
// o3: {name: 'coco'} o1: {name: 'coco'}
// o3์ value๋ฅผ ๋ฐ๊ฟจ์ง๋ง ๋ณธ์์๋๊ฒ o1์ value๊น์ง ๋ฐ๊ฟ๋ฒ๋ ธ๋ค!
โญ๏ธ๊ฐ์ฒด๋ฅผ immutableํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒโญ๏ธ
๋ณต์ฌํ ๊ฒ์ ์์ ํ์!
let o1 = {name:'hailie'}
let o2 = Object.assign({},o1)
o2.name = 'coco'
console.log(o1 === o2) //false ๋ค๋ฅธ ๊ณณ์ ๋ณด๊ณ ์์
Object.assign({},o1)์ ๋น ๊ฐ์ฒด์ ๋ค์ ๋ฐ๋ผ์ค๋ ๊ฐ์ฒด๋ค์ ๋ณํฉํด์ ํ๋์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ๋ฆฌํดํ๋ ์ญํ ์ ํ๋ค.
Nested object ์ค์ฒฉ๋ ๊ฐ์ฒด๋ก ๋ ๊ณต๋ถํด๋ณด๊ธฐ
let o1 = {name:'hailie', score:[1,2]}
let o2 = Object.assign({},o1)
o2.score.push(3)
console.log('o1:', o1, 'o2:', o2)
// o1: {name: 'hailie', score: Array(3)}
name: "hailie" score: (3) [1, 2, 3]
o2: {name: 'hailie', score: Array(3)}
name : "hailie" score: (3) [1, 2, 3]
console.log(o1 === o2, o1.score === o2.score)
// false ture
Object.assign()์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ฉด ๊ฐ์ฒด์ ํ๋กํผํฐ๋ค๋ง ๋ณต์ ๊ฐ ๋๋๊ฑฐ๊ณ , ๊ทธ๋ฐ๋ฐ ๊ทธ ํ๋กํผํฐ ์ค์ value๊ฐ object ํ์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๋ณต์ฌํ๋๊ฒ ์๋๋ผ ์์น๋ฅผ ๋ณต์ ํ๋ค.
๊ทธ๋์ push๋ฅผ ์ฌ์ฉํ์ง๋ง๊ณ concat์ ์ฌ์ฉํด์ ๊ฐ์ ๋ณต์ ํด์ ์ฌ์ฉํด์ผํ๋ค.
(push์ ์๋ณธ ๋ฐฐ์ด์ ๊ฑด๋๋ฆฌ๊ณ , concat์ ์๋ณธ ๋ฐฐ์ด์ ๋ณต์ ํด์ ์ธ์๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ถ๊ฐํ๋ค. )
let o1 = {name:'hailie', score:[1,2]}
let o2 = Object.assign({},o1)
o2.score = o2.score.concat(3)
or
o2.score = o2.score.concat()
o2.score.push(3)
console.log('o1:', o1, 'o2:', o2)
// o1: {name: 'hailie', score: Array(2)}
name: "hailie" score: (3) [1, 2]
o2: {name: 'hailie', score: Array(3)}
name : "hailie" score: (3) [1, 2, 3]
Object.assign()๋ ๋ฐฐ์ด์ด ๊ฐ์ง ํน์ํ ๊ธฐ๋ฅ์ด ์ฌ๋ผ์ง๋ค.
๊ทธ๋์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ concat, slice, Array.from()์ ์ฌ์ฉํด์ผ immutableํ๊ฒ ๋ค๋ฃฐ ์ ์๋ค.
์๋ณธ ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ๋ชปํ๋๋ก ์์ฒ์ ์ผ๋ก ๋ง๋ ๋ฐฉ๋ฒ ๐ Object.freeze
let o1 = {name:'hailie'}
Object.freeze(o1);
o1.name = 'coco'
console.log(o1);
// {name:'hailie'}
Object.freeze๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ผ๋ฆฐ๋ค.
๊ทธ๋ฐ๋ฐ ๊ทธ ํ๋กํผํฐ์ ๊ฐ์ด ๊ฐ์ฒด๋ผ๋ฉด ์ผ๋ฆฌ์ง ๋ชปํ๋ค.
let o1 = {name:'hailie', score:[1,2]}
Object.freeze(o1);
o1.name = 'coco'
o1.city = 'seoul'
o1.score.push(3)
console.log(o1);
// {name:'hailie', score:[1,2,3]}
๊ทธ๋์ ์ง์ ๊ฑฐ๊ธฐ๊น์ง ๊ฐ์ ์ผ๋ ค์ผํ๋ค.
let o1 = {name:'hailie', score:[1,2]}
Object.freeze(o1);
Object.freeze(o1.score);
o1.score.push(3)
console.log(o1);
// typeerror
const vs. Object.freeze
const o1 = {name:'hailie'}
Object.freeze(o1)
const o2 = {name:'hailie'}
o1 = o2 ๐ const๊ฐ ๋ฐ๋ํด์ ์๋ฌ๊ฐ ๋์จ๋ค. o1๊ฐ ๊ฐ๋ฆฌํฌ ๋์์ ๋ชป๋ฐ๊พธ๊ฒ ํ๋ค.
o1.name = 'lee' ๐ Object.freeze()๊ฐ ๋ฐ๋ํด์ ๊ฐ ์๋ฐ๋๋ค. ๊ฐ ์์ฒด๋ฅผ ๋ชป๋ฐ๊พธ๊ฒ ํ๋ค.
๐ const = ๊ฐ๋ฆฌํฌ ๋์์ ๋ชป๋ฐ๊พธ๊ฒ ํ๋ค.
๐ Object.freeze() = ๊ฐ ์์ฒด๋ฅผ ๋ชป๋ฐ๊พธ๊ฒ ํ๋ค.
๋ถ๋ณ์ฑ์ ์๋ณธ์ ํผ์ํ์ง ์๊ณ ๋ณต์ ๋ฅผ ํด์ ์ฌ์ฉํ๋ฉด ์๋ณธ๊ณผ ๋ณต์ ๋ณธ์ ์๋ก ๋ ๋ฆฝ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์์์, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๊ธฐ์น ์๊ฒ ๋์ํ๋ side effect๋ฅผ ์ค์ผ ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ ๋ถ๋ณํจ์ด ๊ฐ๋ณํจ๋ณด๋ค ์ฐ์ํ ๊ฒ์ ์๋๋ค!
๋ค๋ง, ์ปดํจํฐ ๋ถ์ผ๊ฐ ์๋ ์ ์ฐํ๊ธฐ ๋๋ฌธ์ (๊ฐ๋ณ์ด๊ธฐ ๋๋ฌธ์) ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ ์ํด์ ๋ถ๋ณ์ด ๊ฐ์กฐ๋ ๋ฟ์ด๋ค!
์ถ๊ฐ๋ก ๊ณต๋ถํด๋ณด๊ณ ์ถ์ ๊ฒ
๊ฐ์ฒด์งํฅ => ๊ฐ์ฒด๋ฅผ ๋ถํ์ผ๋ก ์ฌ์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด๊ฐ๋ ํจ๋ฌ๋ค์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ => ํจ์๋ฅผ ๋ถํ์ผ๋ก ์ฌ์ฉํ๋ ํจ๋ฌ๋ค์ (๋ถ๋ณ์ฑ์ ์ ํ์ฉํ ์์ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์)
๋ถ๋ณ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ => ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ค์ฌ์ค ์ ์๋ค.
immutable
immer
mori
'๐Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
input ํ๊ทธ ์ ํ์ฉํ๊ธฐ valueAsNumber (0) | 2024.11.30 |
---|---|
[Deep Dive] ํ๋ก๋ฏธ์ค, Promise, Promise.all (0) | 2023.01.03 |
[Deep Dive] ES6 ํจ์์ ์ถ๊ฐ ๊ธฐ๋ฅ (ํ์ดํ ํจ์, REST ํ๋ผ๋ฏธํฐ, ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ) (0) | 2022.12.21 |
[Deep Dive] ajax (0) | 2022.12.20 |
[Deep Dive] ๋๊ธฐ์ ๋น๋๊ธฐ, ๋น๋๊ธฐ๊ฐ ์ฒ๋ฆฌ๋ ์ ์๋ ์ด์ (0) | 2022.12.19 |