데이터 불변성은 함수형 프로그래밍이나 리액트와 같은 라이브러리에서 주로 강조되며, 코드의 예측 가능성과 디버깅 용이성을 향상시켜 신뢰할 수 있는 코드가 될 수 있다.
let greet = 'hello world!';
위의 구문은 'hello world!'라는 값이 메모리에 저장되고, greet 이라는 변수가 이 메모리의 주소를 가리키도록(참조하도록) 하는 것이다.
자바스크립트에서 원시 타입(primitive type)은 변하지 않는 타입이다. 불변 데이터는 한번 생성되고나면 그 뒤에는 변할 수 없다.
let name = 'shj';
// 'shj'라는 string 타입의 값이 메모리에 생성되고, name은 메모리에 생성된 'shj'를 가리킨다.
name = 'haj';
// 'haj'라는 새로운 string 타입의 값이 새로 생성되고, name은 다시 'haj'를 가리킨다.
// 이 때 'shj'는 가비지 컬렉션의 대상이 된다.
let name = 'shj';
let newName = name; // newName은 name이 가리키고 있는 주소('shj' string 값)를 가리킨다.
name = 'haj';
console.log(newName); // shj
console.log(name); // haj
// 세번째 구문까지 실행되었을 때 newName은 여전히 'shj'를 가리키고 있으며 name은 'haj'를 가리킨다.
위의 immutable type을 제외하고 모든 값은 객체(Object)타입이며 변할 수 있는 값이다.
const로 선언한 변수는 값이 불변한다고 생각할 수 있지만, const는 값에 대한 참조(가리키는 것)가 변할 수 없다는 것이지 변수가 참조하고 있는 값이 불변한다는 것은 아니다.const a = {
name: 'shj'
};
const b = a;
a.name = 'haj';
console.log(b.name); // haj
// b는 a가 가리키고 있는 값, {name: 'haj'}로 변화한 데이터의 주소를 똑같이 참조하고 있기 때문이다.
console.log(a === b) // true