let string = 'data1' // 1. string: 'data1'가 메모리 영역1에 등록된다.
string = 'data2' // 2. string: 'data2'가 메모리 영역2에 등록된다.
이로써, 불변성을 지켰다고 한다.
let array = [1, 2, 3, 4] // 메모리영역 1
array.push(5) // 메모리영역 1
console.log(array) // [1, 2, 3, 4, 5]
let array = [1, 2, 3, 4];
array2 = [...array];
// array2에 array를 복사해서 서로 다른 참조 값을 가진다.
array.push(5);
// array = [1, 2, 3, 4, 5];
// array2 = [1, 2, 3, 4];
array === array2; // false
// 따라서 array 의 값 변화는 array2에 영향을 주지 않는다.
// 즉 불변성을 지킴
불변성을 가진 원시타입과 달리 참조타입의 경우에는 의도적으로 불변성을 지켜주어야한다. 이 때 새로운 주소 값을 가진 객체를 생성하여 상태를 업데이트 해준다. spread operator, map, filter, slice, reduce 메소드들을 활용한다.