Modern JavaScript Deep Dive 11장

younghyun·2022년 5월 17일
0

원시 값과 객체의 비교

원시 값

변경 불가능한 값(변수는 재 할당 가능. 변수 값을 변경 불가). 변수(확보된 메모리 공간)에 실제 값 저장. 원시 값 복사되어 전달. ( 값에 의한 전달 ). 읽기 전용 값. 데이터 신뢰성 보장.

  • 불변성
    변수 값을 변경하기 위해 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경함.

    원시 값을 할당한 변수는 재할당 이외에 변수 값 변경 방법이 없음. 변경할 수 있다면 예기치 않게 변수 값이 변경될 수 있다는 것을 의미. 상태 변경 추적하기 어렵게 함.

  • 문자열과 불변성
    1개 문자는 2바이트 메모리 공간에 저장됨. 몇 개 문자로 이루어졌냐에 따라 필요한 메모리 공간의 크기가 결정됨. 숫자 값은 1, 10000 모두 동일한 8바이트가 필요함.

  • 유사 배열 객체
    문자열은 유사 배열 객체(배열처럼 인덱스로 프로퍼티 값에 접근 가능. length프로퍼티 갖는 객체)이면서 이터러블이므로 배열처럼 인덱스로 문자에 접근 가능. for문 순회 가능.

var str = 'string'

console.log(str[0]); // 5

console.log(str.length); // 6
console.log(str.toUpperCase()); // STRING

str[0] = 'S'; 문자열은 원시값이어서 변경 불가. 에러 발생 안함
// 새로운 문자열을 재할당 하는 것은 가능함.

console.log(str); // string
  • 값에 의한 전달
    한 변수에 원시 값을 갖는 변수를 할당하면 원시 값이 복사되어 전달.
    ( 서로 다른 메모리 공간에 저장된 별개의 값 )
var score = 80;

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

console.log(score, copy);// 80 80
console.log(score === copy);// true
// score, copy변수의 값 80은 다른 메모리 공간에 저장된 별개의 값.

객체

변경 가능한 값. 변수(확보된 메모리 공간)에 참조 값 저장. 참조 값(생성된 객체가 저장된 메모리 공간 주소)이 복사되어 전달. ( 참조에 의한 전달 )
객체를 할당한 변수를 참조하면 메모리에 저장된 참조 값을 통해 실제 객체에 접근함.

객체는 크기가 매우 클수도, 원시 값처럼 일정 하지 않을 수도, 프로퍼티 값이 객체일 수도 있어서, 복사(deep copy)비용이 많이 듬. 메모리 효율적 소비가 어렵고 성능이 나빠짐.

메모리를 효율적으로 사용하기 위해, 객체를 복사해 생성하는 비용을 절약하여 성능을 향상시키기 위해 객체는 변경 가능한 값으로 설계되어 있음.
즉, 여러 개 식별자가 하나의 객체를 공유함. 어느 한쪽에서 객체를 변경(객체 프로퍼티 값 변경, 프로퍼티 추가/삭제)하면 서로 영향을 주고 받음.

  • 변수는 O값을 갖는다. 변수 값은 O다.
    변수는 객체를 참조하고 있다. 변수를 객체를 가리키고 있다.

상수

상수도 값을 저장하기 위한 메모리 공간이 필요하므로 변수.

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

// const 키워드를 사용해 선언한 변수에 할당한 원시 값(상수)은 변경할 수 없음.
// const 키워드를 사용해 선언한 변수에 할당한 객체는 변경할 수 있음.
o.a = 1;
console.log(o); // {a:1}
profile
선명한 기억보다 흐릿한 메모

0개의 댓글