모던 자바스크립트 딥다이브 스터디 #2-1 (CH10, 11)

몇번이나 강조하지만 JS의 중 7가지 원시타입(숫자, 문자열, 불리언, null, undefined, 심벌, bigint)를 제외한 모든 값들은 다 객체타입이다.

원시 타입과 객체 타입의 차이

  1. 원시 값은 immutable하다. 객체타입은 mutable하다.
  2. 원시타입이 참조하는 변수공간은 실제 데이터를 저장하고, 객체타입이 참조하는 변수공간은 주소를 저장한다.
  3. 원시타입은 값에 의한 전달(실제 데이터 복사해 넘겨줌)을 진행한다. 객체 타입은 참조에 의한 전달을 진행한다. (주소 복사해 넘겨줌)

사실… 값에 의한 전달이나 참조에 의한 전달이나 이 용어를 달리하는게 더 헷갈리게 만드는 것 같다. 그냥 C식으로 주소도 값(int)으로 생각하면 다 통일되지 않을까..?

문자열과 불변성

JS는 ‘문자열’을 하나의 원시타입으로 간주하지만, 사실 ES사양에 문자열은 문자(2byte)로 이뤄진 집합이다. 따라서 문자열 변수에 인덱스 통해 문자에 접근가능하다.

💡 그래서 문자열을 JS에선 유사 배열객체라고도 부른다. (배열처럼 iterable프로퍼티 있고, length프로퍼티 가진다.) 그렇다고 문자열이 원시타입이라는 명제가 틀린건 아니고, 문자열을 래퍼 객체(String)로 자동으로 감싸서 사용하는 것 뿐이다.

또한 문자열 자체는 하나의 타입으로 immutable한 값이다. C와 동일하다. 아마 다른 메모리공간에 저장되어서 주소만 참조시켜주는 식으로 런타임동안 관리되지 않을까 싶다. 때문에 인덱스로 접근만 가능하고 수정은 불가하다.

값에 의한 전달

새로운 내용은 없다. 값에 의한 전달이란 용어…는 내 생각엔 그냥 안쓰는게 나은것 같다.

차라리 이 단어로 전달하고 싶은 내용은 변수 스코프를 통해 가르치는게 더 나은 것 같음.

💡 참고로 ECMAScript 스펙에는 메모리를 어떻게 관리해야 할지 명확하게 정의되어있지 않아서 JS엔진 구현하는 제조사마다 내부 동작 방식이 다를 수 있다고 한다…