💻 DEV/JavaScript

[Deep Dive] 11장 원시 값과 객체의 비교

웡지 2021. 11. 15. 10:07

11.0 원시타입과 객체타입

  • 원시타입의 값
    • 변경 불가능한 값
    • 변수에 할당 → 확보된 메모리공간에는 실제 값이 저장
  • 객체(참조)타입의 값
    • 변경 가능한 값
    • 변수에 할당 → 확보된 메모리공간에는 참조 값이 저장됨

값에 의한 전달

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

Untitled

참조에 의한 전달

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

Untitled

11.1 원시 값

11.1.1 변경 불가능한 값

상수(const)

  • 재할당이 금지된 변수, 값을 저장하기 위한 메모리 공간이 필요(변수), 한번만 할당이 허용된다.

  • 할당된 원시 값은 변경할 수 없지만, 할당한 객체는 변경할 수 있다.

      const o = {};
    
      o.a = 1;
      console.log(o); // {a:1}

11.1.2 문자열과 불변성

  • 문자열이 생성된 이후에는 변경할 수 없다.

      var str = 'string';
      str[0] = 'S'; // 이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않는다. 
      console.log(str); //string
    
      // 하지만 새로운 문자열을 재할당하는 것은 가능하다.
      str = 'foo';
      console.log(str); //foo

11.1.3 값에 의한 전달

var score = 80;
var copy = score;

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

score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.

→ 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값이 되어 어느 한쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다.

11.2 객체

11.2.1 변경가능한 값

//변수 num은 1의 값을 갖는다. 
var num = 1;

//변수 student 는 객체{name : 'Kim'}를 참조하고 있다. 
var student = {
    name : 'Kim'
};

//student 변수에 저장되어 있는 참조 값으로 실제 객체에 접근한다. 
console.log(student); //{name : 'Kim'}

Untitled

→ 객체는 변경 가능한 값이기 때문에, 재할당 없이 객체를 직접 변경할 수 있다.

→ 동적프로퍼티 추가, 프로퍼티 값 갱신, 프로퍼티 삭제 가능

Untitled

→ 객체는 직접 수정할 수 있다.

→ 객체를 할당한 변수에 재할당하지 않았으므로 객체를 할당한 변수의 참조값은 변경되지 않는다.

얕은복사 깊은복사 ...?

11.2.2 참조에 의한 전달

두 변수는 동일한 참조 값을 갖는다.

var person = {
    name : 'Lee'
}

var copy = person;
// 원본 person 과 사본 copy는 저장된 메모리 주소는 다르지만 동일한 참조 값을 갖는다. 
// -> 두 변수는 동일한 객체를 가리키며
// -> 두개의 식별자가 하나의 객체를 공유한다는 것을 의미한다. 

Untitled

원본 사본 어느 한쪽에서 객체를 변경하면 서로 영향을 주고받는다.

var student = {
    name: 'Kim'
};

// 참조 값을 복사(얕은 복사). copy와 student는 동일한 참조 값을 갖는다. 
var copy = student;

//copy와 student는 동일한 객체를 참조한다. 
console.log(copy === student); //true

//copy를 통해 객체를 변경한다.
copy.name = 'lalala';

//student를 통해 객체를 변경한다. 
person.address = 'Seoul';

//copy와 student는 동일한 객체를 가리킨다.
// 따라서 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받는다.
console.log(student); //{name: 'lalala', address: 'Seoul'}
console.log(copy); //{name: 'lalala', address: 'Seoul'}

11.2.3 정리

공유에 의한 전달 ????

11.3 Quiz

var person1 = {
    name: 'Lee'
};

var person2 = {
    name: 'Lee'
};

console.log(person1 === person2); //false
console.log(person1.name === person2.name); //true