728x90
원시값을 객체 처럼 사용하기
문제점
- 문자열이나 숫자와 같은 원시값을 다뤄야하는데 메서드를 사용하면 작업을 수월하게 할 수 있을 것 같다.
- 원시값은 빠르고 가벼워야한다.
해결
- 원시값은 원시값 그대로 남겨둔다
- 문자열, 숫자, 불린, 심볼의 메서드와 프로퍼티에 접근 할 수 있도록 언어 차원에서 허용한다.
- 이를 가능하게 하기 위해서 원시 래퍼 객체를 만들어준다. 이 객체는 곧 삭제된다.
래퍼 객체
래퍼 객체는 원시 타입에 따라서 종류가 다양하다. 각 래퍼 객체는 원시 자료형의 이름을 그대로 사용해 String, Number, Boolean, Symbol 라고 부른다. 래퍼 객체 마다 제공하는 메서드 역시 다르다.
예시
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
- 문자열 str은 원시값이라서 원시값의 프로퍼티 ( toUpperCase )에 접근하는 순간 특별한 객체가 만들어진다. 이 객체는 문자열의 값을 알고 있고, toUpperCase()와 같은 유용한 메서드를 가지고 있다.
- 메서드가 실행되고 새로운 문자열이 반환된다.
- 특별한 객체는 파괴되고 원시값 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)를 추가할 수 있을까요? 만약 가능하다면 얼럿 창엔 무엇이 출력될까요?
답
엄격모드인지 아닌지에 따라서 결과가 나뉜다.
- 비염격모드 : undefined
- 엄격모드 : An error
무슨 일이 일어나는지 한번 알아보자
- str의 프로퍼티에 접근하려 하면 “래퍼객체” 가 만들어진다.
- 엄격 모드에선 래퍼 객체를 수정하려 할 때 에러가 발생한다.
- 비 엄격 모드에선 에러가 발생하지 않는다. 래퍼 객체에 프로퍼티 test가 추가된다. 그런데 래퍼 객체는 바로 삭제하기 때문에 마지막 줄이 실행될 땐 프로퍼티 test를 찾을 수 없다.
반응형
'JavaScript 개념' 카테고리의 다른 글
iterable 객체 (0) | 2024.04.30 |
---|---|
문자열 (1) | 2024.04.30 |
숫자형 (0) | 2024.04.29 |
객체 (0) | 2024.04.29 |
테스트 자동화와 Mocha (0) | 2024.04.29 |