11장 원시 값과 객체의 비교

이재민·2023년 6월 28일
0

자바스크립트

목록 보기
8/17

원시값

원시 값은 변경 불가능한 값

변경 불가능하다는 것은 변수가 아니라 값에 대한 진술

읽기 전용 값

어떤 일이 있어도 불변하기에 데이터 신뢰성을 보장

불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없음

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

// const 키워드를 사용해 선언한 변수에 할당한 원시 값(상수) 변경할 수 없음
// 하지만 const 키워드를 사용해 선언하 변수에 할당한 객체는 변경할 수 있음

o.a = 1;
console.log(o);

유사 배열 객체

let str = 'string';

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

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

str[0] = 'S'; // 문자열은 원시 값이므로 변경할 수 없음. 에러는 발생하지 않음
console.log(str) // string

값에 의한 전달

let score = 80;
let copy = score;

console.log(score, copy) // 80 80
console.log(score === copy) // true
// score변수와 copy변수의 값 80은 다른 메모리에 저장된 별개의 값임

ex)

let copy = score

score는 식별자 표현식으로서 숫자 값 80으로 평가됨

  • 새로운 80을 생성해서 메모리 주소를 전달하는 방식. 이 방식은 할당 시점에 두 변수가 기억하는 메모리 주소가 다름 (자바스크립트 방식)
  • score의 변수 값 80의 메모리 주소를 그대로 전달하는 방식. 이 방식은 할당 시점에 두 변수가 기억하는 메모리 주소가 같음

이처럼 "값의 의한 전달"도 사실은 값을 전달하는 것이 아니라 메모리 주소를 전달. 단 전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있음.

객체

객체는 변경 가능한 값

let person = {
    name = 'Lee'
}
// 할당이 이루어지는 시점에 객체 리터럴이 해석되고 객체가 생성됨

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

객체는 변경 가능한 값으로 재할당 없이 객체를 직접 변경 가능.

재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있음

객체의 구조로 메모리를 효율적으로 사용할 수 있으나 원시 값과 다르게 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 존재

참조에 의한 전달

let person = {
    name = 'Lee'
}
//참조 값을 복사(얕은 복사)
let copy = person;

//원본 person과 사본 copy 모두 동일한 객체를 가르킴. 두 개의 식별자가 하나의 객체를 공유 

자바스크립트에는 "값에 의한 전달"만이 존재한다고 말할 수 있음.

위와 같은 용어는 공식적으로 정의된 용어는 아님

profile
안녕하세요

0개의 댓글