변경 가능한가?
변수(확보된 메모리)에 저장되는 값이 무엇인가?
값을 갖는 변수를 다른 변수에 할당하면 무엇이 복사되는가?
var str = 'string';
// 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
console.log(str[0]); // s
// 원시 값인 문자열이 객체처럼 동작한다.
console.log(str.length); // 6
console.log(str.toUpperCase()); // STRING
var str = 'string';
// 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
// 하지만 문자열은 원시 값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
str[0] = 'S';
console.log(str); // string
var score = 80;
var copy = score;
console.log(score.copy); // 80 80
console.log(score === copy);//true
score = 100;
console.log(score); // 100
console.log(copy); // 80
할당받는 변수에 할당되는 변수의 원시값이 복사되어 전달(값에 의한 전달)
그러나 서로 다른 메모리 공간에 저장된 별개의 값이며,
어느 한쪽에서 재할당이 일어나 값이 변경되더라도 서로 간섭할 수 없음.
(엄밀히 말하면 메모리 주소를 전달한다. 복사과정까지 같은 원시값을 참조하다가 재할당이 일어나면 새로운 메모리 공간에 재할당 값을 저장할 수도 있음)
객체(참조) 타입의 값, 즉 객체는 변경 가능한 값(mutable value) 이다.
// 프로퍼티 값 갱신
person.name = 'Kim';
// 프로퍼티 동적 생성
person.address = 'Seoul'
console.log(person); // {name: "Kim", address: "Seoul"}
객체는 구조적 단점에 따른 부작용이 있다. 그것은 원시 값과는 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 것이다.
var person = {
name: 'Lee'
};
// 원본의 참조 값을 복사
// 원본과 사본 모두 동일한 객체를 가리킴 = 두개의 식별자가 하나의 객체를 공유
// 한 쪽에서 객체를 변경(새로운 객체 재할당이 아니라 프로퍼티 값을 변경하거나 추가삭제)하면 영향을 받음
var copy = person;
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 === pereon2.name); // true 원시값이 같음