JavaScript 언어의 타입은 두 가지로 나뉩니다.
자바스크립트는 총 8개의 자료형으로 7개의 원시타입과 객체로 구성되어있습니다.
자바스크립트는 느슨한 타입의 동적 언어(Dynamic, weak type)입니다.
처음 선언(Declare) 시점에 특정 타입과 연결되지 않습니다. 변수에 타입 지정없이 할당이 가능하며, 할당하는 과정에서 타입이 결정됩니다.
타입 제한이 없기 때문에 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당과 재 할당이 가능합니다. 즉, 처음에 원시타입으로 선언과 할당을 통해 초기화 해도 이후에 객체 타입으로 재할당이 가능합니다. 같은 방식으로 객체 타입 할당 후 원시타입 재 할당이 가능합니다. 이를 동적 타이핑(Dyanmic Typeing)이라고 합니다.
Boolean, Null, Undefined, Number, BigInt, String, Symbol
원시 타입은 불변 데이터(Immutable Data)이므로 한번 생성되면 Read Only 속성을 가지며, 변경 될 수 없습니다.
💡 자바스크립트의 원시 타입은 값으로 호출 됩니다(call-by-value)
값으로 호출되는 경우에는 메모리 값을 직접 접근하여 수정할 수 없습니다.
(예시1) 변경
let dahye = "Dahye";
dahye[0] = "S";
console.log(dahye); // Dahye
dahye
변수에 할당된 문자열은 원시값이고, Immutable합니다. 특정 문자를 변경하고자 해도 반영되지 않습니다.
(예시2) 재할당
let dahye = "Dahye";
dahye = "Dahye Shin";
console.log(dahye); //Dahye Shin
문자열 변경이 아닌 새로운 값을 할당하는 것은 가능합니다. 원시값이 변경이 불가능하다는 것은 메모리 영역에 있는 값 수정이 불가능 하다는 의미입니다. 재할당을 통해서 메모리 영역에 있는 데이터를 변경하는 것이 아니라 주소를 변경하는 것은 가능합니다.
위의 예시는 “Dahye” 메모리 주소를 가르치던 것이 “Dahye Shin” 메모리 주소를 가르키도록 변경된 것 입니다. 재할당 이후, 도달 가능성(reachable)이 사라진 데이터들은 가비지 컬렉터에 수집하여 메모리에서 삭제합니다.)
💡 자바스크립트의 객체는 참조(pass-by-reference) 전달하고, 전달 받습니다.
단, 객체는 참조되어 있기 때문에 상태가 변경될 수 있다는 문제점을 가지고 있습니다.
주의🚨 : 참조를 가지고 있는 곳에서 객체 상태를 변경한다면, 의도한 동작 외 Side Effect 를 줄 수 있습니다.
이를 방지하기 위해서 Object.freeze()를 사용하여 불변(immutable) 객체로 만들어 사용하거나, 객체를 복사하여 사용하는 방법을 사용 할 수 있습니다.
JavaScript의 타입과 자료구조 - JavaScript | MDN
원시값의 메서드
Immutability | PoiemaWeb
Wrapper function - Wikipedia
JavaScript: Wrapper objects - Programming with Mosh