원시값 : 변경 불가능 / 변수에 원시값 할당 시 실제 값 저장 / 원시값을 갖는 변수를 다른 변수에 재할당 시 실제값 저장
객체 : 변경 가능한 값 / 변수에 객체 할당 시 참조 값 저장 / 객체를 갖는 변수를 다른 변수에 재할당 시 참조값 저장
1. 원시값
변경 불가능 한 값
원시값은 변경 불가능한 값
- 변수 vs 값
- 변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위해 붙인 이름
- 값 : 변수에 저장된 데이터로, 표현식이 평가되어 생성된 결과
=> 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술
- 변수 vs 상수
- 변수 : 언제든지 재할당을 통해 변수 값을 변경할 수 있음
- 재할당 시 변수가 참조하던 메모리 공간의 주소가 재할당한 원시 값의 메모리 주소값으로 바뀜
- 불변성을 갖는 원시값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음
- 만약 재할당 이외에 원시 값인 변수 값을 변경할 수 있다면 예기치 않게 변수 값이 변경될 수 있음을 의미
-> 상태 변경을 추적하기 어렵게 만듦
- 상수 : 단 한번만 할당이 허용되므로 변수 값을 변경할 수 없음 (재할당이 금지된 변수)
- 변수 : 언제든지 재할당을 통해 변수 값을 변경할 수 있음
문자열과 불변성
- 원시 타입별로 메모리 공간의 크기가 미리 정해져 있음
- 문자열타입 (2바이트), 숫자 타입 (8바이트) 이외의 원시타입은 크기를 명확히 규정하고 있지 않아 브라우저 제조사의 구현에 따라 원시 타입의 크기는 다를 수 있음
- 문자열
- 0개 이상의 문자로 이뤄진 집합
- 1개의 문자는 2바이트 메모리 공간에 저장됨 -> 몇 개의 문자로 이뤄졌느냐에 따라 필요한 메모리 공간의 크기가 결정됨
- 자바스크립트는 개발자의 편의를 위해 원시 타입인 문자열 타입을 제공
- 문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 접근 가능
- 유사 배열 객체 : 배열처러 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체.
문자열은 배열처럼 인덱스를 통해 각 문자에 접근할 수 있고 length 프로퍼티를 갖기 때문 for문으로 순회 가능
- 유사 배열 객체 : 배열처러 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체.
값에 의한 전달
- 변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수에는 할당되는 변수의 원시 값이 복사되어 전달됨
- 다른 메모리 공간에 저장된 별개의 값!
- 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다는 것을 명심하기!
- 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억한다. (식별자는 메모리 주소에 붙인 이름)
2. 객체
- 프로퍼티 개수가 정해져 있지 않으며 동적으로 추가되고 삭제할 수 있음
- 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없음
변경 가능한 값
- 객체는 변경 가능한 값 -> 메모리 사용의 효율성, 성능 향상
- 객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조 값 (메모리 공간의 주소)에 접근 가능
<-> 원시값을 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 원시 값에 접근 가능 - 객체를 할당한 변수는 재할당 없이 객체의 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도, 삭제할 수도 있
- 여러 개의 식별자가 하나의 객체를 공유할 수 있음
얕은 복사 vs 깊은 복사
- 얕은 복사 : 객체를 프로퍼티 값으로 갖는 객체의 경우 한단계까지만 복사
- 깊은 복사 : 객체에 중첩되어 있는 객체까지 모두 복사
참조에 의한 전달
- 두 개의 식별자가 하나의 객체를 공유
- 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받음
'스터디 > [모던 자바스크립트 deep dive] JS' 카테고리의 다른 글
#13. 스코프 (0) | 2024.04.27 |
---|---|
#12. 함수 (1) | 2024.04.06 |
#10. 객체 리터럴 (0) | 2024.03.30 |
#9. 타입 변환과 단축 평가 (0) | 2024.03.30 |
#8. 제어문 (1) | 2024.03.23 |