Primitive data type
자바스크립트의 자료형 (문자, 숫자, array, object 등)은 자료형을 크게 2개로 분류합니다.
Primitive & reference라고 분류
Primitive data type들은 그냥 별건 없고 자료 자체가 변수에 저장되는 자료들입니다.
문자, 숫자 자료형들이 대표적인 primitive data type들입니다.
var 이름1 = '김';
var 이름2 = 이름1;
이름1 = '박';
console.log(이름1) // 박
console.log(이름2) // 김
reference data type
var 이름1 = { name : '김' };
var 이름2 = 이름1;
이름1.name = '박';
console.log(이름1); //{name : '박'}
console.log(이름2); //{name : '박'}
두번째줄이 문제입니다.
이름2에 이름1을 복사해서 집어넣을 때가 문제
이 때, 이름1에 있던 { name : '김' } 이라는 데이터가 복사된게 아닙니다.
왜냐면 이름1에는 {} 이게 저장된게 아니라 reference (화살표)가 저장되어있다고 했으니까요.
이름1의 화살표를 이름2에 복사하신겁니다.
이제 이름1과 이름2는 같은 화살표를 가지고 있습니다.
이름1과 이름2는 같은 화살표 (reference) 를 가지게 된 것이고
그 화살표는 { name : '김' } 이라는 같은 값을 가리키고 있는 것일 뿐입니다.
코드 셋째줄에서 이름1.name = '박' 이렇게 값 변경을 하면 어떻게 되나?
화살표를 타고 들어가서 name 을 '박'으로 설정해줍니다.
근데 가만히 있던 이름2를 출력해보면
화살표를 타고 들어가서 { name : '박' } 이라는 데이터가 나오게 되는 것이지요.
아무튼 이런 원리 때문에 이름1과 이름2는 같은 값을 공유하고 있었던 것입니다.
결론은 obj,arr 자료형은 등호로 복사하면 화살표 값을 공유하기 때문에 문제가 일어난다.
var 이름1 = { name : '김' };
var 이름2 = { name : '박' };
위처럼 새로운 {} object를 할당할 때마다 화살표가 새로 생성된다고 생각하면 됨
지금 첫줄과 둘째줄 모두 object를 새로 할당해주고 있습니다.
실은 object가 저기 있다는 화살표를 할당해준 것
var 이름1 = { name : '김' };
var 이름2 = { name : '김' };
이름1 == 이름2 // false
이름1 == 이름2 가 왜 false 가 나오는지?
값이 같아도 화살표가 다름 각각 만든거니까 당연히 화살표도 다르니까
이름1(화살표) == 이름2(화살표) 는 다를수밖에 없는것
var 이름1 = { name : '김' };
function 변경(obj){
obj = { name : 'park' };
}
변경(이름1)
console.log(이름1); // { name : '김' }
변경()함수에서 이름1 = {name:'park'}로 재할당 해주었는데 왜 안바뀜
(인간의 시점)
var 이름1 = { name : '김' };
function 변경(obj){
obj = { name : 'park' };
}
변경(이름1);
(자바스크립트의 시점)
var 이름1 = { name : '김' };
function 변경(obj){
obj = { name : 'park' };
}
변경(var obj = 이름1);
obj라는 파라미터는 변수생성&할당과 똑같다
코드 3번째 줄의 obj = {name:'park'} 이 부분이
var obj = {name:'park'} 이거랑 같다는것
그렇다는건 변경(이름1) 부분이 변경(var obj = 이름1) 과 똑같음
여기서 이름1(변수)에 저장된건 {name : '김'}을 가르키는 화살표임
그래서 obj(파라미터변수)도 같은 화살표를 가지게 되는것
그래서 결론은 변경()함수를 실행해도
obj = {name:'park'} 는 => var obj = {name:'park'}때문에
변수 obj는 {name:'park'} 를 가르키는 화살표가 될 뿐이고
파라미터 자리에 이름1 이 들어가서
이름1 = {name:'park'} 처럼 보여도
이름1 은 {name:'김'} 을 가르키는 화살표일 뿐이다
obj라는 변수에 새로운 화살표를 재할당을 한 것이지
실제 이름1이라는 변수는 전혀 건드리지 않고 있습니다.
그래서 결국 이름1은 바뀌지 않는 것입니다.