11. 원시 값과 객체의 비교
- 원시 타입과 객체 타입의 차이점
- 원시 값은 변경 불가능한 값이지만, 객체는 변경 가능한 값
- 변수(= 확보된 메모리 공간) 할당하면 원시 값은 실제 값을, 객체는 참조 값을 저장함
- 변수 값을 다른 변수에 할당하면 원시 값은 복사되어 전달(값에 의한 전달), 객체는 참조 값이 복사되어 전달됨(참조에 의한 전달)
11.1. 원시 값
11.1.1. 변경 불가능한 값
- 원시 값은 변경 불가능한 읽기 전용 (변수가 아닌) ' 값'
- 데이터의 신뢰성 보장
- 불변성(immutability)
- 변수는 재할당을 통해 값을 변경(교체)할 수 있음
- 값이 있는 변수에 새로운 원시 값을 재할당하면 이전 값을 변경하는 것이 아님
- 새로운 메모리 공간에 재할당 원시 값을 저장 후, 변수가 참조하는 메모리 공간의 주소를 변경함
11.1.2. 문자열과 불변성
- 문자열은 0개 이상의 문자(character)로 이뤄진 집합
- 문자열은 유사 객체 배열이면서 이터러블
- 하지만 문자열은 원시 값이므로 변경 불가능함 -> 데이터 신뢰성 보장
11.1.3. 값에 의한 전달
- 변수에 원시 값을 갖는 변수를 할당하면 원시 값이 복사(copy)됨 -> 값에 의한 전달
- 엄밀히 말하자면 값이 아닌 메모리 주소를 전달하여 이를 통해 값을 참조할 수 있음
- 하지만 다른 메모리 공간에 저장된 별개의 값
- 기존 값과 복사한 값을 변경해도 서로 영향을 주지 않음, 간섭할 수 없음
11.2. 객체
- 객체는 프로퍼티의 개수나 값에 대한 제약이 없기 때문에 원시 값과 다른 동작 방식으로 설계됨
- 프로퍼티 키를 인덱스로 사용하는 해시 테이블(hash table) 방식
11.2.1. 변경 가능한 값
- 객체(참조)는 변경 가능한 값
- 객체를 할당한 변수는 메모리 주소를 저장하고, 메모리 공간에 접근하여 참조 값에 접근함
- 객체를 할당한 변수는 '객체를 참조하고 있다' 또는 '가리키고 있다'고 표현함
- 재할당 없이 동적으로 객체를 직접 변경할 수 있음
- 단, 여러 개의 식별자가 하나의 객체를 공유할 수 있음
- 복사가 아닌 할당을 하는 경우 하나의 객체를 공유함 (비교 결과: true)
- 원본과 복사본은 참조 값이 다른 별개의 객체가 됨 (비교 결과: false)
- 얕은 복사: 한 단계까지만 복사 ({ ... obj })
- 깊은 복사: 객체에 중첩되어 있는 객체까지 모두 복사 (lodash .cloneDeep(obj))
11.2.2. 참조에 의한 전달
- 객체가 저장된 변수를 다른 변수에 할당하면 '참조 값'이 복사되어 전달됨(동일한 객체를 공유함)
- 원본이나 사본 중 어느 한 쪽에서 객체를 변경하면 서로 영향을 받음
[출처] 모던 자바스크립트, Deep Dive