11.0 원시타입과 객체타입
- 원시타입의 값
- 변경 불가능한 값
- 변수에 할당 → 확보된 메모리공간에는 실제 값이 저장
- 객체(참조)타입의 값
- 변경 가능한 값
- 변수에 할당 → 확보된 메모리공간에는 참조 값이 저장됨
값에 의한 전달
- 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달됨
참조에 의한 전달
- 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달됨 (참조 값이 복사되고 객체는 복사되지 않음)
11.1 원시 값
11.1.1 변경 불가능한 값
상수(const)
재할당이 금지된 변수, 값을 저장하기 위한 메모리 공간이 필요(변수), 한번만 할당이 허용된다.
할당된 원시 값은 변경할 수 없지만, 할당한 객체는 변경할 수 있다.
const o = {}; o.a = 1; console.log(o); // {a:1}
11.1.2 문자열과 불변성
문자열이 생성된 이후에는 변경할 수 없다.
var str = 'string'; str[0] = 'S'; // 이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않는다. console.log(str); //string // 하지만 새로운 문자열을 재할당하는 것은 가능하다. str = 'foo'; console.log(str); //foo
11.1.3 값에 의한 전달
var score = 80;
var copy = score;
console.log(score); //80
console.log(copy); //80
→ score
변수와 copy
변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.
→ 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다.
11.2 객체
11.2.1 변경가능한 값
//변수 num은 1의 값을 갖는다.
var num = 1;
//변수 student 는 객체{name : 'Kim'}를 참조하고 있다.
var student = {
name : 'Kim'
};
//student 변수에 저장되어 있는 참조 값으로 실제 객체에 접근한다.
console.log(student); //{name : 'Kim'}
→ 객체는 변경 가능한 값이기 때문에, 재할당 없이 객체를 직접 변경할 수 있다.
→ 동적프로퍼티 추가, 프로퍼티 값 갱신, 프로퍼티 삭제 가능
→ 객체는 직접 수정할 수 있다.
→ 객체를 할당한 변수에 재할당하지 않았으므로 객체를 할당한 변수의 참조값은 변경되지 않는다.
얕은복사 깊은복사 ...?
11.2.2 참조에 의한 전달
두 변수는 동일한 참조 값을 갖는다.
var person = {
name : 'Lee'
}
var copy = person;
// 원본 person 과 사본 copy는 저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다.
// -> 두 변수는 동일한 객체를 가리키며
// -> 두개의 식별자가 하나의 객체를 공유한다는 것을 의미한다.
원본 사본 어느 한쪽에서 객체를 변경하면 서로 영향을 주고받는다.
var student = {
name: 'Kim'
};
// 참조 값을 복사(얕은 복사). copy와 student는 동일한 참조 값을 갖는다.
var copy = student;
//copy와 student는 동일한 객체를 참조한다.
console.log(copy === student); //true
//copy를 통해 객체를 변경한다.
copy.name = 'lalala';
//student를 통해 객체를 변경한다.
person.address = 'Seoul';
//copy와 student는 동일한 객체를 가리킨다.
// 따라서 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받는다.
console.log(student); //{name: 'lalala', address: 'Seoul'}
console.log(copy); //{name: 'lalala', address: 'Seoul'}
11.2.3 정리
공유에 의한 전달 ????
11.3 Quiz
var person1 = {
name: 'Lee'
};
var person2 = {
name: 'Lee'
};
console.log(person1 === person2); //false
console.log(person1.name === person2.name); //true
'💻 DEV > JavaScript' 카테고리의 다른 글
[Deep Dive] 12장 함수 (0) | 2021.11.15 |
---|---|
[Deep Dive] 10장 객체 리터럴 (0) | 2021.11.15 |
[모던자바스크립트 Deep Dive] 09장 타입 변환과 단축평가 (0) | 2021.11.04 |
[모던자바스크립트 Deep Dive] 08장 제어문 control flow statement (0) | 2021.11.04 |
[모던자바스크립트 Deep Dive] 07장 연산자 operator (0) | 2021.11.04 |