많은 사람들이, 자바스크립트에서 모든 것(숫자, 문자열 등)이 객체라고 자신 있게 주장하는 것을 볼 수 있는데, 이는 자바스크립트에 대한 일반적인 오해 중 하나다.

그렇다면 자바스크립트에서 모든 것이 객체인지에 대한 답은 간단하다. 아니다, 자바스크립트에서 모든 것은 객체가 아니다. 자바스크립트의 모든 값은 객체이거나 원시값(Primitive Values)이다.

원시값(Primitive Values)란 무엇인가?

MDN 웹 문서에서 정의한 원시값은 다음과 같다. “객체를 제외한 모든 유형은 언어의 최하위 수준에서 직접 표현된 불변의 값을 정의한다. 우리는 이러한 유형의 값을 원시값이라 한다.”

자바스크립트에는 7가지 원시값 유형이 있다:

  1. Null
  2. Undefined
  3. String
  4. Number
  5. BigInt
  6. Boolean
  7. Symbol

이 원시값들은 설계상 불변성(immutable)을 지닌다. 즉, 원시값이 생성된 후에는 값을 변경할 수 없으나, 이를 담고 있는 변수는 다른 값으로 재할당할 수 있다. 흥미롭게도 null은 원시값이지만, typeof 연산자는 역사적인 버그로 인해 “object”라고 반환한다.

객체값(Object Values)란 무엇인가?

자바스크립트에서 원시값이 아닌 모든 것은 객체이며, 여기에는 함수, 배열, 클래스가 포함된다. 자바스크립트에서 객체는 속성의 집합으로 볼 수 있다. 객체는 기본적으로 가변적(mutable) 값이며, 불변 객체도 생성할 수 있다. 원시값은 속성을 가지지 않는다는 점에서 중요한 차별점이 있다.

그렇다면 왜 원시 데이터 유형에서 속성에 접근할 수 있는가? 예를 들어 다음과 같다.

let num = 123
let str = num.toString()

여기서 숫자 타입에서 toString이라는 속성에 접근하려고 하는데, 이것이 가능한 이유는 자바스크립트가 속성 접근 시 원시값의 자동 박싱(auto-boxing)을 수행하기 때문이다.

원시값의 자동 박싱

자동 박싱은 문자열, 숫자와 같은 원시 데이터 유형을 해당 객체 래퍼로 자동 변환하여 메서드 호출 시 객체에서만 사용 가능한 메서드와 속성에 접근할 수 있게 하는 과정을 말한다. 작업이 완료된 후, 객체는 다시 원시값으로 변환된다. null과 undefined를 제외한 모든 원시 유형은 자동 박싱 시 사용되는 해당 객체 래퍼 유형이 있다.

원시값 객체(Primitive Value Objects)

숫자, 문자열, 불리언을 자체 클래스를 사용하여 생성자와 함께 new 키워드로 생성하면 객체가 되며, 원시값이 아니다. 다음은 그 예시이다.

let a = new Number(1) // "object"

let b = Number(1) // "number"

let c = 1 // "number"

console.log(a == b) // true
console.log(a === b) // false
console.log(b === c) // true

String과 Boolean 또한 동일하다…

카테고리: DEV

0개의 댓글

답글 남기기

아바타 플레이스홀더

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다