본문 바로가기

스터디/[모던 자바스크립트 deep dive] JS

#11. 원시값과 객체의 비교

원시값 : 변경 불가능 / 변수에 원시값 할당 시 실제 값 저장 / 원시값을 갖는 변수를 다른 변수에 재할당 시 실제값 저장

객체 : 변경 가능한 값 / 변수에 객체 할당 시 참조 값 저장 / 객체를 갖는 변수를 다른 변수에 재할당 시 참조값 저장

1. 원시값

변경 불가능 한 값

원시값은 변경 불가능한 값
  • 변수 vs 값 
    • 변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위해 붙인 이름
    • 값 : 변수에 저장된 데이터로, 표현식이 평가되어 생성된 결과
      => 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술
  • 변수 vs 상수
    • 변수 : 언제든지 재할당을 통해 변수 값을 변경할 수 있음
      • 재할당 시 변수가 참조하던 메모리 공간의 주소가 재할당한 원시 값의 메모리 주소값으로 바뀜
      • 불변성을 갖는 원시값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음
      • 만약 재할당 이외에 원시 값인 변수 값을 변경할 수 있다면 예기치 않게 변수 값이 변경될 수 있음을 의미
        -> 상태 변경을 추적하기 어렵게 만듦
    • 상수 : 단 한번만 할당이 허용되므로 변수 값을 변경할 수 없음 (재할당이 금지된 변수)

문자열과 불변성

  • 원시 타입별로 메모리 공간의 크기가 미리 정해져 있음
    • 문자열타입 (2바이트), 숫자 타입 (8바이트) 이외의 원시타입은 크기를 명확히 규정하고 있지 않아 브라우저 제조사의 구현에 따라 원시 타입의 크기는 다를 수 있음
  • 문자열
    • 0개 이상의 문자로 이뤄진 집합
    • 1개의 문자는 2바이트 메모리 공간에 저장됨 -> 몇 개의 문자로 이뤄졌느냐에 따라 필요한 메모리 공간의 크기가 결정됨
    • 자바스크립트는 개발자의 편의를 위해 원시 타입인 문자열 타입을 제공
    • 문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 접근 가능
      • 유사 배열 객체 : 배열처러 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체. 
        문자열은 배열처럼 인덱스를 통해 각 문자에 접근할 수 있고 length 프로퍼티를 갖기 때문 for문으로 순회 가능

값에 의한 전달

  • 변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수에는 할당되는 변수의 원시 값이 복사되어 전달됨
  • 다른 메모리 공간에 저장된 별개의 값!
  • 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다는 것을 명심하기!
    • 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억한다. (식별자는 메모리 주소에 붙인 이름)

 

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