[JavaScript] 모던 자바스크립트 Deep Dive 11장 - 원시 값과 객체의 비교

2022. 7. 15. 00:59Web/JavaScript


11. 1 원시 값

11.1.1 변경 불가능한 값

원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 읽기 전용

데이터의 신뢰성을 보장

// const 키워드를 사용해 선언한 변수는 재할당이 금지된다. 상수는 재할당이 금지된 변수일 뿐이다.
const o = {};

// const 키워드를 사용해 선언한 변수에 할당한 원시 값(상수)은 변경할 수 없다.
// 하지만 const 키워드를 사용해 선언한 변수에 할당한 객체는 변경할 수 있다.
o.a = 1;
console.log(o); // { a: 1 }

11.1.2 문자열과 불변성

원시 값을 저장하려면 먼저 확보해야 하는 메모리 공간의 크기를 결정해야 한다. 이를 위해 원시 타입별로 메모리 공간의 크기가 미리 정해져 있다.

 

* 단, ECMAScript 사양에 문자열 타입(2바이트)과 숫자 타입(8바이트) 이외의 원시타입은 크기가 브라우저 제조사의 구현에 따라 다를 수 있다.

 

var str = 'string';

// 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
// 하지만 문자열은 원시 값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
str[0] = 'S';

console.log(str); // string

11.1.3 값에 의한 전달

var score = 80;

// copy 변수에는 score 변수의 값과 80이 복사되어 할당된다.
var copy = score;

console.log(score, copy); // 80 80
console.log(score === copy); // true

score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장되니 별개의 값이다.

"값의 의한 전달"도 사실은 값을 전달하는 것이 아니라 메모리 주소를 전달한다.

단, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.


11. 2 객체

객체는 프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가 또는 삭제 할 수 있기때문에, 원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.

 

11.2.1 변경 가능한 값

객체(참조) 타입의 값, 즉 객체는 변경 가능한 값이다.

//할당이 이뤄지는 시점에서 객체 리터럴이 해석되고, 그 결과 객체가 생성
var person = {
    name: 'Lee'
};

// person 변수에 저장되어 있는 참조 값으로 실제 객체에 접근한다.
console.log(person); // {name: "Lee"}

객체를 할당한 변수를 참조하면 메모리에 저장되어 있는 참조 값을 통해 실제 객체에 접근


11.2.2 참조에 의한 전달

var person = {
    name: "Lee"
};

// 참조 값을 복수(얕은 복사)
var copy = person;

원본 peson과 사본 copy는 모두 동일한 객체를 가리킨다. 이것은 두 개의 식별자가 하나의 객체를 공유


"값의 의한 전달"과 "참조에 의한 전달"은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달하는 면에서 동일하다. 다만 식별자가 기억하는 메모리 공간, 즉 변수에 저장되어 있는 값이 원시 값이냐 참조값이냐의 차이만 있을 뿐이다. 따라서 자바스크립트에는 "참조에 의한 전달"은 존재하지 않고 "값에 의한 전달만 존재한다고 말할 수 있다.