11 - 원시 값과 객체의 비교

2022. 8. 31.·🎨 프론트엔드 공부/JS & TS

모던 자바스크립트 Deep Dive 정리

원시 타입과 객체 타입

▶JS의 데이터 타입(7개)은 2가지로 나눌 수 있음

1. 원시 타입 (숫자, 문자열, 불리언, undefined, null, symbol)

2. 객체 타입 (객체, 함수, 배열)

 

▶원시 타입 (원시 값)

▷변경 불가능한 값 (읽기 전용)

▷변수에 할당하면 실제 값이 저장됨

 

▶객체 타입

▷변경 가능한 값

▷변수에 할당하면 참조값(메모리 주소)이 저장됨

 

원시 값

▶원시 값은 변경 불가능하다

▷예시

 

var str = 'string';

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

// 문자열은 원시값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
str[0] = 'S';

console.log(str); // string


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

 

값에 의한 전달

▶원시 값은 복사되어 전달된다

▷예시

 

let score = 80;

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

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

// score 변수와 copy 변수의 값은 다른 메모리 공간에 저장된 별개의 값이다.
// 따라서 score 변수의 값을 변경해도 copy 변수의 값에는 어떠한 영향도 주지 않는다.
score = 100;

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

 

▶ 항상 기억할 것은 변수(식별자)는 메모리 주소를 기억하고 있다 (값 자체가 아닌)

 

객체

▶객체는 변경 가능한 값이다

▷예시

 

const person = {
  name: 'Lee'
};

// 프로퍼티 값 갱신
person.name = 'Kim';

// 프로퍼티 동적 생성
person.address = 'Seoul';

console.log(person); // {name: "Kim", address: "Seoul"}

 

▶원시 값을 할당한 변수를 참조하면 메모리에 저장된 원시 값에 접근한다

▷예시

 

변수 메모리 주소 메모리
score 0x00001234 80 (원시 값)

 

▶객체를 할당한 변수를 참조하면 메모리에 저장된 참조값을 통해 실제 객체에 접근한다

▷예시

 

변수 메모리 주소 메모리
person 0x00004567 0x00005678 (객체의 메모리 주소)
  0x00005678 { name : 'Lee' } (객체)

 

▶객체가 변경 가능한 값인 이유 (참조에 의한 전달을 사용하는 이유)

▷메모리를 효율적으로 사용하기 위함

▷변수처럼 복사하여 값을 전달하면, 객체는 어떤 값인지 정해지지 않았기 때문에 (배열.. 객체.. 함수 등) 메모리 비효율적

▷이러한 단점은 여러 개의 식별자가 하나의 객체를 공유하여 서로 영향을 주고받는다는 단점을 보인다

 

 참조에 의한 전달

▶깊은 복사의 경우 두 객체 중 하나를 바꾸면 나머지 객체도 영향을 받는다

▷예시 (객체)

 

const obj = {
  name: 'kim',
  score: {
    math: 80,
    science: {
      bio: 100,
      chem: 90
    }
  }
};

// 참조값을 복사
const test = obj;
// obj와 test는 동일한 참조값을 갖는다.
console.log(obj === test); // true

console.log(test.score.science.chem); // 90
// test를 통해 객체를 변경한다
test.score.science.chem = 75;
// obj에 변경사항이 반영된다
console.log(obj.score.science.chem); // 75

 

▷예시 (배열)

 

const arr = [2, 4, 6, 8];
const test = arr;

arr.push(1);
arr[0] = 3;

// 객체와 마찬가지로 변경사항이 공유된다
console.log(arr); // [3, 4, 6, 8, 1]
console.log(test); // [3, 4, 6, 8, 1]

 

▶얕은 복사

▷예시 (배열)

 

const arr1 = [1, 2, 3];
const shallowCopy1 = [...arr1];
arr1[0] = 10;

// 얉은 복사의 경우 변경사항이 공유되지 않는다
console.log(arr1); // [10, 2, 3] // shallowCopy1 을 바꾸면 shallowCopy1 만 적용됨
console.log(shallowCopy1); // [1, 2, 3]

 

▷객체의 얉은 복사의 경우, 변경사항이 모두에게 적용된다 (배열과 다름)

▷예시

const obj = {
  name: 'kim',
  score: {
    math: 80,
    science: {
      bio: 100,
      chem: 90
    }
  }
};

// 얕은 복사
const test = { ...obj };
obj.score.science.bio = 'changed';
console.log(test === obj); // false
// 변경사항이 모두에게 적용
console.log(test.score.science.bio === obj.score.science.bio); // true

 

'🎨 프론트엔드 공부/JS & TS' 카테고리의 다른 글
  • 13 - 스코프
  • 12 - 함수
  • 10 - 객체 리터럴
  • 09 - 타입 변환과 단축 평가
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
11 - 원시 값과 객체의 비교
상단으로

티스토리툴바