자바스크립트 데이터 타입에는 크게 2가지 타입이 있다. 기본형(원시형, Primitive Type)과 참조형(Reference Type) 이다.
숫자(Number), 문자열(String), 불리언(Boolean), null, undefined, symbol
값을 그대로 할당한다.
symbol 은 ES6에서 추가되었다.
var a = 'mook';
a = false;
var b = a;
b = 30;
console.log(a === b); // false
a
와 b
는 같지 않다. b
에 a
의 값을 할당했을 때는 서로 같지만, b
를 20
으로 재할당하면서 데이터의 값이 변했기 때문이다.
Object(하위 부류 Array, Function, RegExp 등)
값이 저장된 주소값을 할당한다.(참조)
var obj1 = {
a: 1,
b: 'mook'
}
var obj2 = obj1;
obj2.a = 3;
console.log(obj2.a === obj1.a); //true
obj1
와 obj2
의 데이터 형은 참조형이기 때문에 값이 저장된 주소값을 할당한다.
obj2
에 obj1
의 주소를 할당하는데, obj2
는 새로운 객체를 만든 것이 아니라 원래 obj1
에 할당된 객체를 함께 바라보고 있는 것이다. 즉, 두 변수는 완전히 동일한 객체를 참조하고 있다.
obj2.a = 3
은 obj2.a
의 참조된 주소의 데이터 값이 변경된 것이다. 따라서 obj2.a
와 obj1.a
는 같은 주소를 바라보고 있기 때문에 obj2.a
가 변경되면 obj1.a
도 동일하게 변경되어 두 데이터의 값은 같게 된다.
데이터 공간에 기본형 데이터가 담길때까지 반복하는데 기본형 데이터의 집합이라고 볼 수 있다.
null
은 Primitive Type이지만 typeof
로 확인해보면 object
로 출력된다.
자바스크립트 설계 당시부터 있었던 버그라고 한다.
이 버그를 고치기엔 너무 많이 퍼져있어서 그냥 놔두고 있다고 한다.
변수의 데이터타입이 Primitive(기본형)면 불변성, Reference(참조형)면 가변성이다.
Primitive Type 변수를 재할당 하면 데이터 자체가 바뀌는 게 아니고, 메모리 상에서 참조가 바뀌게 된다. 메모리 영역에서의 변경이 불가능하고 재할당은 가능하다
Reference Type 변수는 새로운 객체가 만들어지는게 아니라, 메모리 상에서 참조값만 바뀌게 되는 것입니다.