Egoing Lee 님의 inflearn - Javascript Immutability 강의를 듣고 정리
데이터의 원본을 훼손 하고싶지 않음!!!!!!!!!!!!!!!!!!!!!!!!!
var
vs const
var v = 1;
v = 2;
console.log('v: ', v);
const c = 1;
c = 2 // TypeError Assignment to constant to variable
Primitive | Object |
---|---|
Number | Object |
String | Array |
Boolean | Function |
Null | |
Undefined | |
Symbol |
Primitive
: 원자 데이터 타입 -> 더 이상 쪼갤 수 없음.
Object
: 서로 연관된 정보를 정리정돈(?) 하는데 주로 사용.
var o2 = Obejct = Object.assign({}, o1)
o2 는 새로운 메모리를 참조한다. (원본 데이터의 불변함을 유지 할 수 있다.)
만약 객체의 property에 배열이 있다면, 배열의 주소가 복사된다…따라서 오류가 발생하지 않게 추가적으로 concat 같은 메소드를 사용해줘야 한다.
1.
2.
function fn(person){
Object.assign({}, person);
person.name = 'lee';
return person
}
var o1 = {name: 'kim'}
var o2 = fn(o1); // 여기에서 fn(Object.assign({}, person)) 가능
console.log(o1, o2) // {name: 'kim'}, {name: 'lee'}
var score = [1,2,3];
score.push(4);
console.log(score); // [1,2,3,4]
var score2 = [1,2,3];
var score3 = score2.concat(4);
console.log(score2) // [1,2,3]
concat
: 원본을 복제하여 리턴 > 원본을 immutable 하게 유지
객체를 불변하게 만들어주는 함수 ( 누구도 수정 불가능,, )
var o1 = {name: 'kim', score: [1,2]}
Object.freeze(o1);
o1.name = 'lee'
console.log(o1) // {name: 'kim', score: [1,2]}
o1은 완벽하게 immutable 하게 됨.
하지만 nested object에서 문제가 생긴다..
o1.score.push(3)
console.log(o1.score) // [1, 2, 3]
이것을 방지하기 위해서는 property의 객체에도 Object.freeze를 해줘야 한다.
Object.freeze(o1.score)
o1.score.push(3) // Error!!
const
는 이름이 가리키는 값 대상을 못 바꾸게 한다. => 이름을 규제한다
Object.freeze
는 값 자체를 못 바꾸게 한다 ( Property를 못 바꾸게 한다.) => 값을 규제한다.