본문 바로가기

공부/Java script

[Java Script]원시타입과 객체타입

변경불가능한 값(=원시값)

원시값은 변경 불가능한 값이다. 변수와는 개별적인 개념으로 생각하면 이해하기 쉽다. 한 번 할당한 원시 값은 값 자체를 변경할 수 없고 어떤 일이 있어도 불변한다.  하지만 변수는 const(상수)로 선언하지 않는 이상 다른 값을 가질 수 있다. 변수는 재할당이 가능하기 때문이다.  아래에서 선언한 'num' 변수에 할당된 '50'이라는 값은 원시값이다.

변수에 '80'이라는 값을 재할당하면 메모리에 새로운 원시 값이 저장되고 변수가 참조하던 메모리의 주소가 바뀐다.

 

var num = 50;
num = 80;

변수는 값이 아니라 메모리 주소를 기억하고 있다. 

그렇다면, 변수에 다른 변수를 할당했을 때는 어떻게 저장될까? 변수가 가리키는 주소값에 저장된 원시값은 변수끼리 간섭할 수 없다. 따라서 num변수에 할당되어있는 원시값을 다른 메모리 공간에 복사하여 원시값을 저장하고 new변수에 새로운 메모리의 주소값이 전달된다.

var num = 60;
new = num;
console.log(new); //60출력

 

num 변수에 다른 값을 할당하더라도 new값에 영향을 주지 않는다.

 

변경 가능한 값(=참조값)

변수에 객체를 할당하면 생성된 객체가 저장되어있는 주소가 저장된다. 여기서 저장되어있는 실제 객체는 변경이 가능한 값이므로 프로퍼티의 값의 변경이나 프로퍼티의 추가가 동적으로 자유롭다. 이러한 저장방식 때문에 원시값보다는 객체를 저장하는 것이 더 많은 비용을 소모한다. 

var data = {name: 'Lee'};
data.name = 'Kim';
data.age = 20
console.log(data); // {name:'Kim', age:20}

변수에는 객체의 메모리 주소값이 저장된다

원시값과 다르게 객체는 하나의 객체를 여러개의 변수가 참조할 수 있다. 이것은 한 변수에서 프로퍼티의 값을 변경하는 경우에 다른 변수에도 해당값이 변경된다는 것을 의미한다. 즉, 변수끼리 값에 영향을 주게된다. 여기서 동일한 객체를 참조하는 경우 비교 연산자로도 true의 결과가 나온다. 

var data = {name: 'Lee'};
var new = data;

console.log(data === new); //true
new.age = 20; //프로퍼티에 새로운 값 할당
console.log(data); //{name:'Lee' age:20}

만약 변수가 서로 다른 객체를 참조하는 경우 비교연산자에서 당연히 false가 나온다. 다만 두 객체의 프로퍼티의 값을 평가하여 비교하는 경우에 두 값이 같으면 true이다.

var data = {name: 'Lee', age: 20};
var new = {name: 'Kim', age: 20};
console.log(data === new);
console.log(data.age === new.age);

ps. 변수명은 원래 예약어에 해당하는 new를 사용하면 안된다.