JavaScript 개념

원시값의 메서드

ron_nie 2024. 4. 29. 16:53
728x90

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

문제점

  • 문자열이나 숫자와 같은 원시값을 다뤄야하는데 메서드를 사용하면 작업을 수월하게 할 수 있을 것 같다.
  • 원시값은 빠르고 가벼워야한다.

해결

  1. 원시값은 원시값 그대로 남겨둔다
  2. 문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근 할 수 있도록 언어 차원에서 허용한다.
  3. 이를 가능하게 하기 위해서 원시 래퍼 객체를 만들어준다. 이 객체는 곧 삭제된다.

래퍼 객체

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

예시

let str = "Hello";

alert( str.toUpperCase() ); // HELLO
  1. 문자열 str은 원시값이라서 원시값의 프로퍼티 ( toUpperCase )에 접근하는 순간 특별한 객체가 만들어진다. 이 객체는 문자열의 값을 알고 있고, toUpperCase()와 같은 유용한 메서드를 가지고 있다.
  2. 메서드가 실행되고 새로운 문자열이 반환된다.
  3. 특별한 객체는 파괴되고 원시값 str만 남는다

⚠️ 주의!!

Java 등 몇몇 언어에서는 new를 사용하여 래퍼객체를 생성할 수 있는데 자바스크립트에서는 이 기능을 추천하지 않는다.

alert ( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"
let zero = new Number(0);

if (zero) { // zero는 객체이기 때문에 참이된다.
	alert("zero가 무조건 참이라고?")
}

하지만 new를 사용하지 않고 String / Number / Boolean 를 사용하는 것은 괜찮다. 이 경우에는 상식에 맞게 인수를 원하는 형의 원시값으로 바꿔준다.

let num = Number("123"); // 문자열을 숫자로 바꿔줌

또한 null 과 undefined는 메서드가 없다.

alert(null.test) // error!

문제

문자열에 프로퍼티를 추가할 수 있을까?

let str = "Hello";

str.test = 5;

alert(str.test);

아래 코드를 실행하면, 의도한 대로 문자열(str)에 프로퍼티(test)를 추가할 수 있을까요? 만약 가능하다면 얼럿 창엔 무엇이 출력될까요?

 

엄격모드인지 아닌지에 따라서 결과가 나뉜다.

  1. 비염격모드 : undefined
  2. 엄격모드 : An error

무슨 일이 일어나는지 한번 알아보자

  1. str의 프로퍼티에 접근하려 하면 “래퍼객체” 가 만들어진다.
  2. 엄격 모드에선 래퍼 객체를 수정하려 할 때 에러가 발생한다.
  3. 비 엄격 모드에선 에러가 발생하지 않는다. 래퍼 객체에 프로퍼티 test가 추가된다. 그런데 래퍼 객체는 바로 삭제하기 때문에 마지막 줄이 실행될 땐 프로퍼티 test를 찾을 수 없다.
반응형