모던 자바스크립트 Deep dive 11장 원시 값과 객체의 비교를 읽고 정리한 글이다.
원시 값과 객체는 크게 3가지 측면에서 다르다.
1. 원시 값은 변경 불가능한 값, 객체는 변경 가능한 값
2. 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장, 객체를 변수에 할당하면 변수에는 참조 값이 저장됨
3. 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 잔달됨(값에 의한 전달), 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달(참조에 의한 전달)
var str = 'string';
//문자열은 원시 값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다
str[0] = 'S';
console.log(str);
var score = 80;
//copy 변수에는 score의 값 80이 복사되어 전달됨
//2가지 평가 방식으로 평가 가능
//1. 새로운 80을 생성(복사)해서 메모리 주소를 전달하는 방식. 이 방식은 할당 시점에 두 변수가 기억하는 메모리 주소가 다르다.
//2. score의 변수값 80의 메모리 주소를 그대로 전달하는 방식. 이 방식은 할당 시점에 두 변수가 기억하는 메모리 주소가 같다. 한 변수에 재할당 시 그 변수의 메모리 주소가 변동된다.
var copy = score;
console.log(score, copy); //80 80
console.log(score === copy);// true
// score 변수와 copy 변수의 값은 다른 메모리 공간에 저장된 별개의 값이다.
// 따라서 score 변수의 값을 변경해도 copy 변수의 값에는 어떠한 영향도 주지 않는다.
score = 100;
console.log(score, copy); // 100 80
console.log(score === copy); // false
var person = {
name: 'Lee'
}
var person = {
name: 'Lee'
}
person.name = 'Kim';
person.address = 'Seoul';
객체의 구조적 단점: 원시 값과 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있음
var person = {
name: 'Lee'
}
var copy = person;