Chapter 11 원시 값과 객체의 비교
원시타입과 객체타입은 크게 세가지 측면에서 다르다.
1. 원시타입의 값 즉 원시값은 변경불가 값. 객체(참조)타입의 값, 즉객체는 변경 가능한 값
2.원시값을 변수에 할당하면(확보된 메모리공간)에는 실제 값이 저장
3. 원시값을 갖는 변수를 다른변수에 할당하면 원본의 원시값이 복사되어 전달 이를 값에 의한 전달 // 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달. 이를 참조에 의한 전달
문자열과 불변성
// 문자열은 0개이상의 문자로 이루어진 집합.
var str1 = '';
var str2 = 'hello';
var str = 'Hello';
str = 'world';
var str = 'string';
str[0] = 'S';
console.log(str); // string
var score = 80;
var copy = score; // 변수 score를 할당!
console.log(score, copy); // 80 80
var score = 80;
var copy = score;
console.log(score, copy); // 80 80
score = 100;
console.log(score, copy); // 100 80
즉, 두 변수의 원시 값은 서로 다른 메모리 공간에 저장되 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다
var score =80;
var copy = score;
console.log(score,copy);// 80 80
console.log(score ===copy); // true
객체
객체는 프로퍼티의 갯수가 정해져 있지않고 동적으로 추가 삭제할 수 있다. 또한 프로퍼티의 값에도 제약이 없는 복합적인 자료구조,원시값과는 다른방식으로 동작 하도록 설계되어 있다.
그렇다면 변수에 객체를 할당하면 어떤일이 일어나나?
var person = { name: 'Lee' }; console.log(person); // {name: "Lee"}
객체를 할당한 변수에는 생성된 객체가 실제로 저장된 메모리 공간의 주소가 저장.
이값을 참조값 이라함. 참조 값은 생성된 객체가 저장된 메모리 공간의 주소 그자체.
변경 가능한 값
객체는 변경 가능한 값임. 그래서
var person = { name: 'Lee' }; person.name = 'Kim'; person.address = 'Seoul'; console.log(person); // {name: "Kim", address: "Seoul"}
그렇기 때문에 메모리를 효율적으로 사용하기 위해서 객체는 변경 가능한 값으로 설계되어 있다.
참조에 의한 전달
하지만 이렇게 설계됨에 따라 부작용이 발생하게 된다 여러개의 식별자가 하나의 객체를 공유할 수 있다는 문제.
var person = {
name: 'Lee'
};
var copy = person;
var person = {
name: 'Lee'
};
var copy = person;
copy.name = 'Kim';
person.address = 'Seoul';
console.log(person); // {name: 'Kim', address: 'Seoul'}
console.log(copy); // {name: 'Kim', address: 'Seoul'}
얕은 복사(shallow copy)
const o = { x: { y: 1 } };
// 얕은 복사
const c1 = { ...o }; // 35장 "스프레드 문법" 참고
console.log(c1 === o); // false
console.log(c1.x === o.x); // true
// lodash의 cloneDeep을 사용한 깊은 복사
// "npm install lodash"로 lodash를 설치한 후, Node.js 환경에서 실행
const _ = require('lodash');
// 깊은 복사
const c2 = _.cloneDeep(o);
console.log(c2 === o); // false
console.log(c2.x === o.x); // false
var person = {
name: 'Lee'
};
// 참조값을 복사(얕은 복사). copy와 person은 동일한 참조값을 갖는다.
var copy = person;
// copy와 person은 동일한 객체를 참조한다.
console.log(copy === person); // true
// copy를 통해 객체를 변경한다.
copy.name = 'Kim';
// person을 통해 객체를 변경한다.
person.address = 'Seoul';
// copy와 person은 동일한 객체를 가리킨다.
// 따라서 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받는다.
console.log(person); // {name: "Kim", address: "Seoul"}
console.log(copy); // {name: "Kim", address: "Seoul"}
var person1 = {
name: 'Lee'
};
var person2 = {
name: 'Lee'
};
console.log(person1 === person2); // false
console.log(person1.name === person2.name); // true