js

js deep dive [11장 정리 원시 값과 객체의 비교]

mallang_col 2022. 10. 24. 16:02

11 원시 값과 객체의 비교 

 

숫자, 문자열 불리언 null, undefined, symbol, object

 

원시타입, 객체 타입으로 구분 가능하다.

 

예를들어서 let a 라는것에 0 을 할당 했다고 하자.

이때 0 은 원시 값으로 0이 할당 된다 .

이때 변수의 값을 10 으로 변경했다고 한다면

같은 주소의 값이 변경 되는 것이 아니라.

 

0x00000 번지에 0 이 저장 됐다고 한다면

0x00001 번지에 10을 저장하고 이 주소를 

가르킨다고 볼 수 있다.

 

하지만 이 주소를 직접 찾아보고자 했는데 이는 확인 이 불가능했음.

그렇지만 일단. 자바스크립트의 경우 그런식으로 원본값의 변화를 일으키지 않도록

한다. 따라서 

우리가 사용하는 상수와는 차이가 있음을 알 수 있다.

 

Const obj = {} 의 경우 

프로퍼티 값을 수정할 수 있다.

하지만 여기서 obj 자체를 수정할 수 는 없는데 

 

Obj = “” 와 같은 식으로 

자체를 수정 할 수는 없다 따라서 그 근본적인 주소 자체는 수정이 불가능하다.

이를 불변성 이라고 보는듯 함.

 

let str = "asdf"

undefined

str[0] = "C"

'C'

console.log(str)

VM1343:1 asdf

와 같이 할당된 곳에 값이 변화가 없음을 알 수 있다.


그렇다면 

Let a = 3;

Let b = 5;

라고 했을때 

Let c = a + b; 라고 한다면

어떻게 동작이 일어나는 것일까.

A의 주소를 참조하고 , b의 주소를 참조해서 

더하는 과정이 내부적으로 일어난다.

 

이때 a 와 b 는  원시값들을 값으로 가지고 있는데 

어떻게 동작이 가능한 것일까 ?

A + b = 10 인경우

A +  b = 15 인경우 

자바스크립트에서는 값의 변경이 일어나는것이 아니라 .

주소값의 변경을 뜻한다고 이해했다.

 

Var person = {

name : ‘lee’

}

Var person2 = {

name : ‘lee’

}

 

Var new_person = person 일때 

 

new_person.name = ‘ho’;

console.log(new_person);

console.log(person); 을 했을 때 

같은 값을 가르킨다.

 

new_person의 값을 변경하거나 추가하게 되었을때 

원본인 person또한 변경되는데 이는 

변화 할 수 있기 때문이다.

따라서 객체의 경우 참조한 값을 변경함으로 내부의 변화를 일으킬 수 있다.

 

여기서 person === person2 를 하게 되면 false 가 나오는 이유또한 그러하다.

 

js 를 공부하면서 느끼는 바로는 실질적으로 우리가 메모리의 주소에 할당이 되고 재할당이 될때,

그리고 값이 변경 될 때 이를 바로 찾아 볼 수 없다는 것이 있는데.

이는 c++ 내부에서 이부분에 대한것을 처리하기 때문인듯 하다. 따라서 이와 유사하게 메모리의 변화를 관측 하기 위해서는 

c또는 cpp 를 이용해서 테스트를 처리해보면 좋을듯 하다.