Immutability 는 객체가 생성된 이후에 그 상태를 변경할 수 없는 디자인 패턴을 의미한다.
위 원시 타입을 제외한 모든 값은 객체타입으로 변경이 가능한 값이다.
Object -> mutable value
즉 객체는 새로운 값을 만들 필요없이 직접 변경이 가능하다.
var str = 'Hello';
str = 'world';
식별자 str은 메모리에 생성된 문자열의 'Hello'의 메모리주소를 가리킨다.
그리고 두번째 str은 기존의 'Hello'를 수정하는 것이 아니라,
새로운 문자열 'world'를 메모리에 생성하고 식별자 str은 이것을 가리킨다.
var statement = 'I am an immutable value';
var otherSTr = statement.slice(8,17);
console.log(otherStr) / immutable
console.log(statement) / i'am an immutable value
2행에서 String 객체의 slice 메소드는 statement변수에 저장된 문자열을 변경하는 것이 아니라, 새로운 문자열을 생성하고 반환하고 있는 것이다.
이유는 문자열은 변경이 불가한 immutable 이기 때문이다.
var arr =[]
console.log(arr.length) //0
var v2 = arr.push(2);
console.log(arr.length) // 1
배열(객체) 메소드 push는 직접 대상 배열을 변경하기 때문에
기존 arr의 배열안에 2가 들어간다.
이유는 배열은 객체이자, immutable이 아니기 때문이다.
var user = {
name: 'Lee',
address: {
city: 'Seoul'
}
};
var myName = user.name; // 변수 myName은 string 타입이다. 따라서 직접 변경이 불가능하다.
user.name = 'Kim';
console.log(myName); // Lee
myName = user.name; // 재할당
console.log(myName); // Kim
var user1 = {
name: 'Lee',
address: {
city: 'Seoul'
}
};
var user2 = user1; // 변수 user2는 객체 타입이다. 따라서 user2.name으로 값을 바꾸면 바로 변경이 가능하다.
user2.name = 'Kim';
console.log(user1.name); // Kim
console.log(user2.name); // Kim