JS 데이터 타입은 기본형과 참조형이 있어요.
엥, 변수 값 재할당 되고 변경 되던데요❓❓
let a = 10;
a = 20; // 되잖아!?
그래요, 변수는 재할당되죠~
하지만 값 자체는 변경이 불가능해요. 무슨 말이냐구요?
두 변수가 값에 의한 전달이 일어날 경우를 생각해보면
let a = 10;
let b = a;
a = 20;
a가 변한다고 b가 변하나요? 그럴리가
두 변수의 원시 값은 서로 다른 메모리 공간
에 저장된 별개의 값이 되어 어느 한쪽에서 값을 변경하더라도 서로 간섭할 수 없습니다.
이를 불변성(immutable)한 상태를 가진다고 하는 것입니다.
객체
는 property 개수가 정해져 있지 않죠?
따라서 property가 동적으로 추가, 삭제됩니다.
확보해야할 메모리 공간의 크기를 미리 정할 수가 없어요.
그래서 객체를 생성하고 property에 접근하는 것도 원시 값과 비교하면 비용이 많이 드는 일입니다.😂😂
객체는 원시값과는 다른 방식으로 동작하게 됩니다.
객체는
변경 가능한 값(mutable value)
으로 설계되었습니다. 메모리에 저장된 객체를 직접 수정할 수 있습니다.
여러 개의 식별자가 하나의 객체를 공유할 수 있다는 것입니다.
예를 들어볼까요??
var x = { count : 100 };
var y = x;
x.count = 99; // x를 바꿨는데
console.log(y); // 99
// y도 바뀌어요!
var list1 = [1, 2, 3]; // 메모리 주소 : 1234a
var list2 = [1, 2, 3]; // 메모리 주소 : 2345b
var isSame = list1 === list2; // 1234a 와 2345b 를 비교해요!
console.log(isSame); // false
var list3 = [1, 2, 3];
var list4 = list3; // list4가 list3와 같은 주소를 참조하겠죠?
var isSame = list3 === list4;
console.log(isSame); // true
따라서 원본 또는 사본 중 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받게 됩니다.
다양한 방법을 통해 이런 실수를 하지 않도록 신경 써줘야 겠습니다...