js deep dive [11장 정리 원시 값과 객체의 비교]
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 를 이용해서 테스트를 처리해보면 좋을듯 하다.