원시 타입 객체 타입
타입의 값은 변경 불가능 변경 가능
값을 변수에 할당하면 실제 값이 저장 참조 값이 저장
값을 갖는 변수를 다른 변수에 할당하면 원시 값이 복사되어 전달  
(= 값에 의한 전달) 참조 값이 복사되어 전달  
(= 참조에 의한 전달)    

11.1 원시 값

11.1.1 변경 불가능한 값

  • 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다. (= 변수는 변경 가능하다. 헷갈리지 말자)
  • 재할당할 때, 새로운 원시 값을 만들고, 변수가 가리키는 주소를 수정한다. (= 원시값은 변경 불가능하다.)

Untitled

  • 원시 값의 이러한 특성을 불변성이라고 한다.

11.1.2 문자열과 불변성

  • 문자열은 유사 배열 객체이면서 이터러블이다. 따라서 배열과 유사하게 각 문자에 접근할 수 있다.
  • 유사 배열 객체란 마치 배열처럼, 인덱스로 프로퍼티 값에 접근할 수 있고, length 프로퍼티를 갖는 객체를 말한다. ⇒ for 문 순회 가능

    var str = "string";
    
    // 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
    console.log(str[0]); // s
    
    // 원시 값인 문자열이 객체처럼 동작한다.
    console.log(str.length); // 6
    console.log(str.toUpperCase()); // STRING
    
    var str = "string";
    
    // 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다.
    // 하지만 문자열은 원시값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
    str[0] = "S";
    
    console.log(str); // string
    

11.1.3 값에 의한 전달

  • 원시 값은 복사되어 전달된다. (값에 의한 전달)
  • score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.
var score = 80;

// copy 변수에는 score 변수의 값 80이 복사되어 할당된다.
var 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

Untitled

  • 엄격하게 말하면 변수에는 값이 전달되는 것이 아니라, 메모리 주소가 전달된다.
  • 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있다.
  • 가장 정확한 표현은 ‘값에 의한 전달’은 값을 전달하는 것이 아니라 메모리 주소를 전달한다. (서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한 쪽에 재할당을 하더라도 서로 간섭할 수 없다.)

11.2 객체

11.2.1 변경 가능한 값

  • 객체는 변경 가능한 값이다.
  • 객체를 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 참조 값에 접근할 수 있다.
  • 참조 값은 생성된 객체가 저장된 메모리 공간의 주소, 그 자체다.

Untitled

// 할당이 이뤄지는 시점에 객체 리터럴이 해석되고, 그 결과 객체가 생성된다.
var person = {
  name: "Lee",
};

// person 변수에 저장되어 있는 참조값으로 실제 객체에 접근해서 그 객체를 반환한다.
console.log(person); // {name: "Lee"}

11.2.2 참조에 의한 전달

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

Untitled

  • 두 개의 식별자가 하나의 객체를 공유하고 있다. = 한 쪽에서 객체를 변경하면 서로 영향을 주고받는다.





이 포스트는 모던 자바스크립트 Deep Dive를 공부하며 정리한 내용입니다.