원시 값
변경 불가능한 값
- 원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. ⇒ 불변성
- 변경 불가능하나는 것은 변수가 아니라 값에 대한 진술이다.
- 즉, 변수가 변경 불가하다는게 아니라(재할당이 가능하니,) 원시 값 자체를 변경할수 없다는 것이다.
재할당
- 원시 값을 할당한 변수에 새로운 원시 값을 재할당 하면 메모리 공간에 저장되어있는 재할당 이전의 원시 값을 변경 하는 것이 아니라, 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한후, 변수는 새롭게 재할당한 원시 값을 가리킨다.
- 이때 변수가 참조하던 메모리 공간의 주소가 바뀐다.
문자열과 불변성
- 원시 타입별로 메모리 공간의 크기가 정해져있지만, 문자열은 몇개의 문자로 이루어 졌느냐에 따라 필요한 메모리 공간의 크기가 결정된다.
- 변수에 할당된 문자열의 값 자체를 바꾸는것은 불가능하지만, 재할당은 가능하다.
값에 의한 전달
- 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다.
- 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기때문에 아래같은 일이 일어난다
let score = 90
let copy = score
score = 100
객체
자바스크립트 객체의 관리 방식
- 프로퍼티 키를 인덱스로 사용 하는 해시테이블(map,dictionary등)과 유사하지만 높은 성능을 위해 일반적인 해시 테이블 보다 나은 방법으로 객체를 구현한다.
- 클래스 기반 객체 지향 프로그래밍 언어는 사전에 정의된 클래스를 기반으로 객체를 생성한다.
- 하지만 자바스크립트는 클래스 없이 객체를 생성할 수 있으며 객체가 생성된 이후라도 동적으로 프로퍼티와 메서드를 추가할 수 있다.
- 성능면에서는 자바스크립트의 객체생성과 프로퍼티 접근에 비용이 더 많이 들기에, v8 자바스크립트 엔진에서는 히든 클래스 라는 방식을 사용한다.

변경 가능한 값
- 객체는 변경 가능한 값이다.
- 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있고, 프로퍼티 자체를 삭제할 수도 있다.
- 객체를 복사해 생성하는 비용을 절약하여 성능을 향상시키고 메모리를 효율적으로 사용하기위해 변경 가능한 값으로 설계되어있지만, 그로인해 여러개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 발생했다.
변수에 객체 할당
- 객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면, 참조값에 접근 할 수 있다.
- 참조값 : 생성된 객체가 저장된 메모리 공간의 주소 그자체이다.
- 원시값을 할당한 변수를 참조하면 메모리에 저장된 원시값에 접근하지만, 객체를 할당한 변수를 참조하면 메모리에 저장된 참조값을 통해 실제 객체에 접근한다.

얕은 복사와 깊은 복사
- 객체를 프로퍼티 값으로 갖는 객체의 경우 얕은 복사는 한단계 까지만 복사하는 것을 의미
- 깊은 복사는 객체에 중첩되어있는 객체까지 모두 복사하는 것을 말한다.
- 얕은 복사와 깊은 복사로 생성된 객체는 원본과는 다른 객체다, 즉 원본과 복사본은 참조 값이 다른 별개의 객체다. 하지만 얕은 복사는 객체에 중첩되어 있는 객체의 경우 참조값을 복사하고, 깊은 복사는 객체에 중첩되어 있는 객체까지 모두 복사해서 원시 값 처럼 완전한 복사본을 만든다는 차이가 있다.
참조에 의한 전달