11장 원시 값과 객체의 비교

박찬미·2023년 11월 27일
0

자바스크립트의 7가지 데이터 타입은 크게 원시 타입과 객체 타입으로 구분할 수 있다.

11.1 원시 값

원시 값은 변경 불가능한 값이다.
한번 생성된 원시 값은 읽기 전용값으로서 변경할 수 없다.

//const 키워드를 사용해 선언한 변수는 재할당이 금지된다. 상수는 재할당이 금지된 변수일 뿐이다.
const o ={};

//const 키워드를 사용해 선언한 변수에 할당한 원시 값(상수)는 변경할 수 없다.
//하지만 const 키워드를 사용해 선언한 변수에 할당한 객체는 변경할 수 있다.
o.a =1;
console.log(o); //{a:1}

11.2 문자열과 불변성

//문자열은 0개 이상의 문자로 이뤄진 집합니다.
var str1 = ''; //0개의 문자로 이뤄진 문자열(빈 문자열)
var str2 ='hello'; //5개의 문자로 이뤄진 문자열
유사 배열 객체
마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체를 말한다.
문자열은 마치 배열처럼 인덱스를 통해 각 문자에 접근할 수 있으며, length 프로퍼티를 갖기 때문에 유사 배열 객체이고 for 문으로 순회할 수도 있다.
var str = "string";

//문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
console.log(str[0]); //s

//원시 값인 문자열이 객체처럼 동작한다.
console.log(str.length); //6
console.log(str.toUpperCase()); //STRING

11.1.3 값에 의한 전달

//변수copy에 원시 값을 갖는 변수score를 할당하면 할당받는 변수copy에는 할당되는 변수score의 원시 값이 복사되어 전달된다.
var score = 80;
var copy = score;

console.log(score); // 80
console.log(copy);  // 80

var score = 80;

// copy 변수에는 score 변수의 값 80이 복사되어 할당된다.
var copy = score;

console.log(score, copy); // 80  80
console.log(score === copy); // true

값에 의한 전달은 자바스크립트를 위한 용어가 아니므로 오해가 있을 수도있다.
엄격하게 표현하면 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달되게 때문이다.
변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기 때문이다.

객체

객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되며 삭제할 수도 있다. 값에 제약도 없다.
객체는 사전에 메모리 공간의 크기를 정해둘 수 없다.

❗️자바스크립트 객체 관리 방식

  • 프로퍼티 키를 인덱스로 사용하는 해시 테이블 구조
  • 자바스크립트는 클래스 없이 객체 생성 가능, 객체 생성 이후 동적으로 프로퍼티와 메서드 추가 가능

❗️얕은 복사와 깊은 복사

  • 얕은 복사 : 객체를 프로퍼티 값으로 갖는 객체의 경우 한 단계까지만 복사
  • 깊은 복사 : 객체에 중첩되어 있는 객체까지 모두 복사
//얕은 복사
const c1 = {...o};
console.log(c1 ===o); //false
console.log(c1.x === o.x);//true

//lodash의 cloneDeep을 사용한 깊은 복사
const _ =require('lodash');

//깊은 복사
const c2 = _.cloneDeep(o);
console.log(c2 ===o); //false
console.log(c2.x === o.x);//false

참조에 의한 전달

  • 객체를 가르키는 변수(원본)를 다른 변수(사본)에 할당하면 원본의 참조 값이 복사되어 전달된다.
    이를 참조에 의한 전달이라고 한다.
  • 두개의 식별자가 하나의 객체를 공유
profile
우당탕탕

0개의 댓글