freeze

es버전
Tags
동결
비고
전부 변경 불가. 다만 참조형 속성값은 값을 변경할 순 있다. 원뎁스까지만 동결 deep freeze 하려면 참조형 속성값들 순회하면서 다 freeze() 걸어야함.

Object Freeze

오브젝트const에 담으면 ref를 const에 담는 것일 뿐이다.
새로운 오브젝트를 할당시키는 것은 안되지만, 오브젝트 내의 속성값을 바꾸는 것은 가능했다.
오브젝트의 속성 값도 const로 둘 순 없을까?
Object.freeze 메소드를 제공한다.

Object.freeze 예시

const OBJ = { a : 1, b : 2 } Object.freeze(OBJ); OBJ.a = 3; // 에러는 안나더라도 오브젝트 속성값이 바뀌진 않음. OBJ // { a:1, b:2 } 그대로임.
오브젝트 속성값의 원뎁스 까지는 const로 두는 효과가 되었다.

Deep Freezing

하지만 여기서 한가지 문제점이 있다.

참조형 데이터가 담겨있다면?

오브젝트 속성에 참조형 데이터가 담겨있을 경우에는 freeze를 하면, 아예 새로운 값으로 바꿀 순 없어지지만, 참조형 데이터 내의 값은 바꿀 수 있다. 왜? ref가 바뀌는 것은 아니니까!
const OBJ = { a : 1, b : [1, 2, 3] } Object.freeze(OBJ); OBJ.b[0] = 4; OBJ // { a:1, b:[4, 2, 3] } 으로 바뀌었다.
이것도 막고싶다면 오브젝트 내의 참조형 데이터에도 Object.freeze() 메소드를 호출해줘야 한다.
const OBJ = { a : 1, b : [1, 2, 3] } Object.freeze(OBJ); Object.freeze(OBJ.b); // 오브젝트 내의 참조형 데이터에도 freeze() 걸어야 불변성 유지됨. OBJ.b[0] = 4; OBJ // { a:1, b:[1, 2, 3] } 그대로.
근데 오브젝트 내의 속성값이 몇 depth까지 탈 지 모르므로, 속성값들을 순회하며 freeze를 시켜줘야 완전하게 불변성을 유지할 수 있다.