원시 타입 | 객체 타입 |
---|---|
변경 불가능한 값 | 변경 가능한 값 |
변수에 할당시 변수(확보된 메모리 공간)에는 실제 값이 저장 | 변수에 할당시 변수(확보된 메모리 공간)에는 참조 값이 저장 |
다른 변수에 원시값을 갖는 변수를 할당하면 원본의 원시값이 복사되어 전달(값에 의한 전달) | 다른 변수에 객체를 가리키는 변수를 할당하면 원본의 참조값이 복사되어 전달(참조에 의한 전달) |
var score = 80;
var copy = score;
//두가지 평가방식 가능
//1. 새로운 80을 생성(복사)해서 메모리 주소를 전달하는 방식(할당시점에 두 변수가 기억하는 메모리 주소 다름)
//2. score 변수값80의 메모리 주소를 그대로 전달하는 방식(할당시점에 두 변수가 기억하는 메모리 주소 같음)
console.log(score);//80
console.log(copy); //80
console.log(score === copy) //true
score = 100;
console.log(score);//100
console.log(copy);//80
console.log(score === copy) //false
var score = 80;
var copy = score;
console.log(score);//80
console.log(copy); //80
console.log(score === copy) //true
// score변수와 copy변수의 값은 80으로 동일하지만 다른 메모리 공간에 저장된 별개의 값이다.
// ⇒ score의 값을 변경해도 copy변수의 값에는 영향이 가지 않는다.
다른 할당 방법2 : 변수에 원시값을 갖는 변수를 할당하는 시점에는 두 변수가 같은 원시값을 참조하다가 어느 한쪽의 변수에 재할당이 이루어졌을때 새로운 메모리 공간에 재할당된 값을 저장하도록 동작할 수도 있다.
“값에 의한 전달”이라는 용어를 썼지만,
엄격하게 표현하면 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다. 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있다. (단, 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있다.)
변수에 원시값을 갖는 변수를 할당하면 결국 두 변수의 원시값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 할쪽에서 재할당을 통해 값을 변경해도 서로 간섭할 수 없다.
var person = {
name : 'Lee'
};
person.name = 'Kim';//프로퍼티 값 갱신(수정)
person.address = 'Seoul';//프로퍼티 동적 생성
var person = {
name : 'Lee'
}
//참조값을 복사(얕은 복사)
var copy = person;
console.log(copy === person); //true //두개의 변수는 동일한 객체를 가리킨다.
copy.name = 'Kim';
person.address = 'Seoul';
// 얕은 복사로 서로 영향을 주고받는다.
console.log(person); //{name:"Kim", address:"Seoul"}
console.log(copy); //{name:"Kim", address:"Seoul"}
서로 다른 객체가 내용은 같지만 가리키는 참조값이 다르면 false이다.
원시 값을 할당한 객체의 프로퍼티를 비교하면 값 자체를 비교한다.
var person1 = { name : 'Lee' }
var person2 = { name : 'Lee' }
console.log(person1 === person2); //false
console.log(person1.name === person2.name); //true