- immutable
- 변수에는 실제 값이 저장
- 다른 변수에 할당 시 원본의 원시 값이 복사되어 전달 - pass by value
- mutable
- 변수에는 참조 값이 저장
- 할당 시 참조 값이 복사되어 전달 - pass by reference
- 한번 생성된 원시 값은 읽기 전용
📌 변수
- 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 / 메모리 공간을 식별하기 위해 붙인 이름
📌 값
- 변수에 저장된 데이터
- 표현식이 평가되어 생성된 결과
⇒ 변경 불가능한 것은 ‘값' 이다! (변수는 재할당을 통해 저장하고 있는 값을 교체 할 수 있음)
⇒ 데이터의 신뢰성을 보장
-
javascript에서 원시 타입은 크기를 명확하게 규정하고 있지 않음.
→ 브라우저 제조사의 구현에 따라 크기가 다를 수 있음
-
0개 이상의 문자로 이루어진 집합
-
1개 문자 = 2Byte
⇒ 문자열의 길이에 따라 필요한 메모리 공간의 크기가 결정됨
-
array-like object 이면서 이터러블 → 배열처럼 각 문자에 접근 가능
var str = 'string'; //array-like object console.log(str[0]); // s 배열처럼 인덱스로 프로퍼티 값에 접근 가능 console.log(str.length); // 6 length 프로퍼티를 가짐
//이어서 str[0] = 'J'; console.log(str[0]); // s;
✏️ 문자열 값도 원시 값이므로 immutable하고 변경할 수 없다. (재할당은 가능)
var score = 80;
var copy = score;
console.log(score === copy); // true
✏️ score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값
(엄밀히 말하자면 pass by value도 사실은 메모리 주소를 전달하고 있음. 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억)
- 프로퍼티 개수가 정해져 있지 않음
- 동적으로 추가디고 삭제
⇒ 메모리 크기를 사전에 정해둘 수 없다
프로퍼티 키를 인덱스로 사용하는 해시 테이블
→ javascript 엔진은 해시 테이블과 유사하지만 높은 성능을 위해 일반적인 해시 테이블보다 나은 방법으로 객체를 구현
-
V8 자바스크립트 엔진
→ 프로퍼티에 접근하기 위해 동적 탐색 대신 히든 클래스 사용
자바와 같이 고정된 객체 레이아웃(클래스)과 유사하게 동작
-
원시 값을 할당한 변수: 원시 값 자체를 값으로
객체를 할당한 변수: 변수가 기억하는 메모리 주소를 통해 참조 값(reference value)에 접근 가능
-
단점:
메모리의 효율적 소비가 어렵고 성능이 나빠질 수 있음
여러 개의 식별자가 하나의 객체를 공유할 수 있음
const o = { x: { y: 1 }};
//shallow copy
const c1 = { ...o}; // { x: {y: 1}}
console.log(c1 === o) // false
console.log(c1.x === o.x) //true
//deep copy
const _ = require('lodash');
const c2 = _.cloneDeep(o);
console.log(c2 == o); // false
console.log(c2.x === o.x); //false
공통점
-
식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달
⇒ 엄밀히 말하면 javascript에서는 ‘참조에 의한 전달'은 존재하지 않음. ‘값에 의한 전달'만 존재
(여기서 말하는 참조에 의한 전달은 pointer의 참조에 의한 전달과 다름)