원시 값
- 숫자, 문자열, 불리언, null, undefined, 심벌
- 불변성 : 읽기전용, 값을 변경할 수 없음(immutable value)
- 값에 의한 전달(pass by value)
- 값을 변경하려면 값을 복사하여 새로운 메모리에 할당하고, 해당 메모리 주소를 전달
문자열
- 문자열 == 유사 배열 객체
- 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고, length 프로퍼티를 가짐
- 배열처럼 인덱스를 통해 각 문자에 접근할 수 있으며, for 문으로 순회 가능
- 원시 값인 문자열을 배열처럼 사용할 경우, 원시 값을 감싸는 래퍼 객체로 자동 변환됨
- 단, 문자열은 변경 불가능한 값이기 때문에, 문자열의 일부를 변경해도 반영되지 않음
참조 값
- 객체
- 프로퍼티 개수가 정해져 있지 않으며, 동적으로 추가, 삭제 가능
- 프로퍼티 값에도 제약이 없음
- 변경 가능한 값(mutable value) ⇒ 재할당 없이 객체 변경 가능
- 참조에 의한 전달(pass by reference)
- 단, 이 경우에도 원본과 사본에 저장된 메모리 주소는 다르지만, 동일한 참조 값을 가짐
- 결국, 값에 의한 전달과 참조에 의한 전달 모두 식별자가 기억하는 메모리 공간에 저장된 값을 복사해서 전달하기 때문에 동일하다고 볼 수 있음
- 즉, 식별자가 기억하는 메모리 공간, 즉 변수에 저장된 값이 원시 값이냐, 참조 값이냐의 차이일 뿐
- 단점
- 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 것
<aside>
📢 “값에 의한 전달”과 “참조에 의한 전달”은 ECMAScript 사양에 정의된 공식 용어가 아님
</aside>
자바스크립트 원시 값 불변성 이유?
- 값이 변경되지 않기 때문에 변수의 상태를 예측하기 쉬움
- 여러 변수가 동일한 값을 참조하는 경우, 하나의 변수에서 값이 변경되더라도 다른 변수에는 영향을 미치지 않아 예기치 못한 버그를 방지하고 코드의 안정성을 향상시킴