원시값과 객체의 비교
Deep DIve 10장
:book: 11장 원시 값과 객체의 비교
:pencil: 원시 값과 객체의 비교
자바스크립트가 제공하는 7가지 데이터(숫자, 문자열, 불리언, null, undefined, 심벌, 객체 타입)은 크게 원시 타입과 객체 타입으로 원시 구분할 수 있다. 구분하는 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 다시말해, 한 번 생성된 원시 값은 읽기 전용 값으로서 변경할 수 없다.
:pencil: 문자열과 불변성
var str = 'string';
str[0] = 'S';
console.log(str); // string
이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않는다. 문자열은 변경 불가능한 값이기 떄문이다. 이는 데이터의 신뢰성을 보장한다. 그러나 변수에 새로운 문자열을 재할당하는 것은 가능하다. 이건 기존 문자열을 변경하는 게 아니라 새로운 문자열을 새롭게 할당하는 것이기 때문이다.
:pencil: 값에 의한 전달
결국은 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다는 것 객체는 프로퍼티의 개수가 정해져있지 않으며 동적으로 추가되고 삭제할 수 있다. 또한 프로퍼티의 값에도 제약이 없다. 따라서 객체는 원시 값과 같이 확보해야할 메모리 공간의 크기를 사전에 정해둘 수 없다.
객체는 복합적인 자료구조이므로 객체를 관리하는 방식이 원시 값과 비교해서 복잡하고 구현방식도 브라우저 제조사마다 다를 수 있다. 원시 값은 상대적으로 적은 메모리를 소비하지만 객체는 경우에 따라 크기가 매우 클 수도있다. 객체를 생성하고 프로퍼티에 접근하는 것도 원시값과 비교할때 비용이 많이 드는 일이다. 따라서 객체는 원시 값과는 다른 방식으로 동작하도록 설계되어있다.
:pencil: 변경 가능한 값
객체(참조)타입의 값, 즉 객체는 변경 가능한 값이다.
원시 값은 변경 불가능한 값이므로 원시 값을 갖는 변수의 값을 변경하려면 재할당 외에는 방법이 없다. 하지만 객체는 변경 가능한 값이다. 객체를 할당한 변수는 재할당 없이 객체를 직접 변경할 수 있다. 즉, 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티의 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있다.
var person = {
name:’Lee’
};
// 프로퍼티 값 갱신
person.name = ‘Kim’;
// 프로퍼티 동적 생성
person.address = ’Seoul’;
console.log(pesron); // {name: “Kim”, address: “Seoul”}