← 글 목록

notes

11장. 원시 값과 객체의 비교

모던 JS Deep Dive — 원시 값과 객체의 저장·복사·비교 차이 정리.

참고: 이웅모 《모던 자바스크립트 Deep Dive》 11장 · [MDN Primitive](https://developer.mozilla.org/en-US/docs/Glossary/Primitive) / [Equality comparisons](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness)

const a = b가 객체일 때 “복사가 아니라 같은 상자”라는 걸 늦게 알았다. 원시는 값 자체, 객체는 참조. 이 한 줄이 불변성·버그·복사 전략의 출발점이다.

flowchart LR
  PRIM[원시] -->|복사| PRIM2[다른 값]
  OBJ[객체] -->|할당| REF[같은 참조]
  REF --> MUT[한쪽 변이 = 양쪽 관찰]

11.1 원시 값

변경 불가능한 값

숫자·문자열·불리언·null·undefined·symbol·bigint. 값을 “고치는” 게 아니라 새 값을 만든다.

문자열 불변성

let s = 'hi';
s[0] = 'H'; // 무시/엄격 모드 에러
s = 'Hi'; // 재할당

값에 의한 전달

함수에 넘기면 값이 복사되어 전달(원시).

function bump(n) { n += 1; }
let x = 1;
bump(x);
console.log(x); // 1

11.2 객체

변경 가능한 값

프로퍼티를 바꿀 수 있다. const여도 내용 변경 가능.

참조에 의한 전달

변수엔 참조가 담긴다. 함수에 객체를 넘기면 같은 대상을 만진다.

function touch(o) { o.x = 1; }
const obj = { x: 0 };
touch(obj);
console.log(obj.x); // 1

예제 — 얕은 복사

const a = { x: 1, nest: { y: 2 } };
const b = { ...a };
b.x = 9;
b.nest.y = 8;
console.log(a.x, a.nest.y); // 1, 8 — nest는 공유

깊은 복사: structuredClone / 라이브러리.

헷갈리던 장면 / 함정

  • const = 불변 객체
  • 배열/객체 비교 ===는 참조
  • 실수로 공유 상태 변이
  • JSON 직렬화로 “복사” 시 undefined/함수/Date 손실

표

질문 → 자답

Q. 불변 업데이트? A. 스프레드로 새 객체/배열. 중첩은 경로마다 새 참조.

Q. Object.freeze? A. 얕은 동결(16). 중첩은 별도.

웹 보강 메모

MDN Equality. Immer 같은 불변 헬퍼와 언제 쓸지.

실무로 바로

  • 상태 업데이트는 새 참조
  • 함수 인자 변이 금지(또는 명시)
  • 비교는 id/값 단위

여기서 잠깐 💁‍♂️

12장 함수 — 값으로 전달되는 행동. 원시/참조와 함께 읽힌다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.

연습·복습 체크리스트

  • [ ] 이 장 핵심 표를 백지에 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 관련 페이지 북마크
  • [ ] 실무 코드에서 같은 패턴 검색·리팩터 후보 표시
  • [ ] 앞뒤 장과 한 줄로 연결해 보기

일기 보강

처음엔 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다. 원문 복붙 없이 왜 이렇게 동작하나만 남겼다.

웹·스펙 메모

MDN과 스펙 용어가 다를 수 있다. 노트에는 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 팀 컨벤션이 없으면 이 장 표를 초안으로 제안한다.

실무 적용

PR 리뷰에 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다.