[모던딥다이브 자바스크립트] 11장 원시 값과 객체의 비교

zzzzzang_gu·2023년 2월 25일
1

자바스크립트

목록 보기
9/23

원시 타입의 값과 객체 타입의 값

  • 원시 타입의 값 , 즉 변경 불가능한 값이다. 이에 비해 객체 타입의 값, 즉 객체는 변경 가능한 값이다.

  • 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장, 객체를 변수에 할당하면 변수에는 참조 값이 저장된다.

원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달이라 한다.

객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다. 이를 참조에 의한 전달이라 한다.


원시 타입 값

원시 값을 할당한 변수에 새로운 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한 후 , 변수는 새롭게 재할당한 원시 값을 가르킨다.

변수에 할당된 원시 값이 변경 불가능한 값이기 때문에 변수가 참조하던 메모리 공간의 주소가 바뀐다. 값의 이러한 특성을 불변성이라 한다.
불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.

var str = 'string';

//문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근 가능
//하지만 문자열은 원시 값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
str[0] = 'S';

console.log(str) // string

유사 배열 객체 : 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체를 말한다.

위 예제 처럼 한번 생성된 문자열은 읽기 전용 값으로서 변경할 수 없다. 이는 데이터의 신뢰성을 보장한다.



객체

객체는 프로퍼티 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제할 수 있다. 또한 프로퍼티의 값에도 제약이 없다. 따라서 객체는 원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.

객체는 변경 가능한 값이다. 따라서 객체를 할당한 변수는 재할당 없이 객체를 직접 변경할 수 있다. 즉, 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있다.

객체는 여러개의 식별자가 하나의 객체를 공유할 수 있다.

얕은 복사와 깊은 복사

객체를 프로퍼티 값으로 갖는 객체의 경우 얕은 복사는 한 단계까지만 복사하는 것을 말하고 깊은 복사는 객체에 중첩되어 있는 객체까지 모두 복사하는 것을 말한다.

const o = {x:{y:1}};

//얕은 복사
const c1 = {...o} // 스프레드 문법
console.log(c1 === 0 ) // false
console.log(c1.x === o.x) // true

참조에 의한 전달

여러 개의 식별자가 하나의 객체를 공유한다면


var person ={name :"Park"};


//참조 값을 복사 
var copy = person;

객체를 가르키는 변수(원본,person)을 다른 변수(사본,copy)에 할당하면 원본의 참조 값이 복사되어 전달된다. 이를 참조에 의한 전달이라 한다.

위 예제처럼 person을 copy에 할당하면 원본 person의 참조 값을 복사해서 copy에 저장한다. person과 copy는 저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다. 다시 말해, 원본 person과 사본 copy는 모두 동일한 객체를 가리킨다. 이것은 두개의 식별자가 하나의 객체를 공유한다는 것을 의미한다.

profile
프론트엔드 개발자가 되겠습니다🔥

1개의 댓글

comment-user-thumbnail
2023년 2월 27일

제로베이스 프론트엔드 스쿨 입니다 !
과정 시작한지 1달이 다 되어가는데요.
공부하시면서 블로그 작성까지 하는 것이 쉽지
않으실텐데 정말 대단하신 것 같아요 !
취업 준비하실 때 많은 도움이 되실테니
힘드시더라도 끝까지
꾸준히 작성하시면 좋을 것 같습니다.
오늘도 화이팅 하세요:)

답글 달기