원시값의 메서드

김하은·2023년 5월 11일
0

자바스크립트는 원시값을 마치 객체처럼 다룰 수 있게 해준다.
원시값에도 객체에서처럼 메서드를 호출할 수 있다.
다만.. 원시값은 객체가 아니다.!!

원시값

  • 원시형 값
  • 종류: 문자(string), 숫자(number), bigint, 불린(boolean), 심볼(Symbol), null, undefined 총 7가지.

객체

  • 프로퍼티에 다양한 종류의 값을 저장할 수 있다.
  • {name:"JJ",age:12} 와 같이 중괄호를 사용해 만들 수 있다.
    자바스크립트에는 여러 종류의 객체가 있는데 함수도 그 일종이다.

객체의 장점중 하나: 함수도 프로퍼티로 저장이 가능하다.
그러나 이러한 기능을 사용한다면 시스템 자원이 많이 소모된다는 단점이 있다
=> 객체는 원시값보다 무겁고 내무 구조를 유지하기 위해 추가 자원을 사용하기 때문이다.

원시값을 객체처럼 사용하기

자바스크립트 창안자는 여러 모순적인 상황들을 해결해야만 했다.

  • 문자열이나 숫자와 같은 원시값을 다루어야 하는 작업이 많은데 메서드를 사용하면 작업을 수월하게 할 수 있을 것 같다는 생각이 들었다.
  • 그런데 원시값은 가능한 빠르고 가벼워야 한다..

자바스크립트 창안자는 아래와 같은 방법을 사용해 해결책을 모색했다.

  1. 원시값은 원시값 그대로 두어 단일값 형태를 유지한다.
  2. 문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근할 수 있도록 언어 차원에서 허용한다.
  3. 이것을 가능하게 하기 위해서 원시값이 메서드나 프로퍼티에 접근하려고 하면 추가 기능을 제공해주는 특수한 객체 '원시 래퍼 객체'를 만들어준다. 이 객체는 곧 삭제된다.

'래퍼객체'는 원시타입에 따라 종류가 다양하다.
각 래퍼객체는 원시 자료형의 이름을 그대로 차용해 String, Number, Boolean, Symbol 이라고 부른다.
래퍼객체마다 제공하는 메서드 역시 다르다.

자바 등의 몇몇 언어에서는 new Number(1) 또는 new Boolean(false) 와 같은 문법을 사용해 원하는 타입의 래퍼객체를 직접 만들 수 있다.
자바스크립트에서도 하위 호환성을 위해 이 기능을 남겨두었는데 이런 방식으로 래퍼객체를 만드는것은 몇몇 상황에서 혼동을 불러일으키기에 추천하지 않는다.

alert( typeof 0 ); // "number"

alert( typeof new Number(0) ); // "object"!

객체논리 평가시 항상 참을 반환하기에 아래의 alert창은 무조건 열리게 된다.

>
```js
let zero = new Number(0);

if (zero) { // 변수 zero는 객체이므로, 조건문이 참이 됩니다.
  alert( "그런데 여러분은 zero가 참이라는 것에 동의하시나요!?!" );
}

그런데, new를 붙이지 않고 String / Number / Boolean 을 사용하는것은 문제가 없다.
new가 없이 사용되면 원하는 형의 원시값으로 바꿔준다.

let num = String(123) => 문자형으로 변경된다.

0개의 댓글