11장 원시 값과 객체비교
: 자바스크립트가 제공하는 데이터 타입은 크게 원시 타입
과 객체 타입
으로 구분
- 원시 값은 변경 불가능한 값이다. 객체는 변경 가능한 값이다.
- 원시값은 변수에 할당하면 실제 값이 저장된다. 객체를 변수에 할당하면 변수에는 참조값이 저장된다.
- 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다.(값에 의한 전달)
객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다.(참조에 의한 전달)
11.01. 원시값
- 변경이 불가능 하다는 것은 변수가 아닌 값에 대한 변경을 뜻함
- 값을 변경하기 위해 재할당을 하면 변수가 참조하던 메모리 주소가 변경 (불변성)
- 즉 불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.
11.01.01. 문자열과 불변성
- 문자열은 원시타입이며 변경이 불가능하다
ex )
let str = "Hello"
str = "world"
> 위의 경우 첫번째 코드는 "Hello"가 생성 되고 "Hello"가 저장된 메모리 셀 주소를 가리킨다.
두번째 코드가 실행되면서 이전에 "Hello"를 수정하는 것이 아닌 "world"를 생성하고 해당 메모리 주소를 가리킨다.
그렇기 때문에 메모리엔 두가지 값이 모두 존재
유사배열 객체란 ?
유사 배열 객체란 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고
length 프로퍼티를 갖는 객체를 말한다.
문자열은 마치 배열처럼 인덱스를 통해 각 문자에 접근할 수 있으며,
length 프로퍼티를 갖기 때문에 유사 배열 객체이고 for 문으로 순회할 수도 있다.
ex)
let st`r = 'string'
console.log(str[0]) //s
console.log(str.lenght) //6
//하지만 문자열은 원시값이기 떄문에 변경 못함`
11.01.02. 값에 의한 전달
원시 값을 갖는 변수를 할당하면 할당받는 변수에는 할당되는 변수의 원시 값
이 복사되어 전달된다.
이를 값에 의한 전달
이라고 한다.
var score = 80;
var copy = score;
console.log(score); // 80
console.log(copy); // 80
score = 100;
console.log(score); // 100
console.log(copy); // 80
11.02.객체
: 객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제 가능!
따라서 객체는 원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없어서 원시 값과는 다른 방식으로 동작한다.
11.02.01. 변경 가능한 값
- 객체를 할당한 변수에는 생성된 객체가 실제로 저장된 메모리 공간의 주소가 저장되어 있다. 이 값을
참조 값
이라고 한다. - 원시 값을 할당한 변수를 참조하면 메모리에 저장되어 있는
원시 값
에 접근한다. - 객체를 할당한 변수를 참조하면 메모리에 저장되어 있는
참조 값
을 통해실제 객체
에 접근한다. - 객체는 변경 가능한 값이므로 재할당 없이 객체를 직접 변경할 수 있다.
- 원시값과 다르게 여러개의 식별자가 하나의 객체를 공유할 수 있다.
얕은 복사와 깊은 복사
- 얕은 복사
- 객체의 프로퍼티 값을 갖는 객체경우 한단계 까지만 복사
객체를 가리키는 변수를 다른 변수에 할당하면 참조 값이 복사되어 전달되는데, 이를 참조에 의한 전달(얕은 복사)이라 한다.
ex)
const o = { x: { y: 1 } };
//얕은 복사
const c1 = { ...o };
console.log(c1 === o); //false
console.log(c1);
console.log(o);
console.log(c1.x === o.x); //true
console.log(c1.x);
console.log(o.x);
// o와 c1이 가리키는 객체의 내용은 같지만 다른 메모리에 저장된 별개의 객체이다.
- 깊은 복사
- 객체의 프로퍼티 값을 갖는 중첩되어있는 객체까지 모두 복사
객체에 중첩되어있는 객체까지 모두 복사해서 원시값처럼 완전한 복사본을 만든다는 차이가 있다.
ex)
const v = 1
//깊은 복사
const c1 =v
console.log(c1 === v); //true
console.log(c1);
11.02.02. 참조에 의한 전달
var person = {
name : 'Lee'
};
// 참조 값을 복사(얕은 복사)
var copy = person;
위와 같이 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값
이 복사되어 전달된다. 이를 참조에 의한 전달이라 한다.
이경우 저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다.
이것은 두 개의 식별자가 하나의 객체를 공유한다는 것을 의미한다.
따라서 원본 또는 사본 중 어느 한쪽에서 객체를 변경하면 서로 영향을 주고받는다.
'FrontEnd_Study > JAVASCRIPT' 카테고리의 다른 글
[JavaScript Deepdive] 13장 스코프 (0) | 2024.01.10 |
---|---|
[JavaScript Deepdive] 12장 함수 (0) | 2024.01.01 |
[JavaScript Deepdive] 09장 타입 변환과 단축평가 (1) | 2023.12.27 |
[JavaScript Deepdive] 10장 객체 리터럴 (0) | 2023.12.27 |
[자바스크립트 딥다이브] 08장 제어문 (0) | 2023.12.24 |