JS에서의 Boxing 처리개발/JavaScript2023. 6. 21. 15:14
Table of Contents
Javascript에서 다음과 같은 메소드를 사용한 경험이 있을 것이다.
// 대문자로 변경하는 경우
const test_1 = "hello world!";
test_1.toUpperCase();
// 소수점 표현하는 경우
const test_2 = 1.0001;
test_2.toFixed(1);
"hello world!" 와 1.0001 는 원시타입이다.
즉, 객체가 아니기에 가지고 있는 메서드가 없는 것이다.
하지만 메서드를 사용할 수 있는 이유가
자바스크립트 엔진에서 Boxing 과정이 이루어지기 때문이다.
Boxing
원시타입을 래퍼 객체로 wrapping하는 과정을 말한다.
test_1 변수를 기준으로 설명하고자 한다.
우선 test_1.toUpperCase() 를 실행하게 되면
javascript에서 test_1의 원시 타입의 Reference타입인 String 객체로 암묵적으로 변환 시킨다.
그리고 String의 프로토타입 체이닝을 통해 toUpperCase() 메소드를 찾아 실행하게 된다.
test_2 변수도 같은 과정이 일어나서 toFixed(1) 을 실행할 수 있게 된다.
주로 명시적으로 하기보다 암묵적이다.
Unboxing
반대로 Reference타입의 객체의 원시 값을 얻는 과정을 말한다.
valueOf() 메소드를 이용해서 unboxing을 할 수 있다.
const a = new Boolean(false);
const a2 = false;
if(a === a2) {
console.log('Success');
} else {
console.log('Fail');
}
// Fail 이 출력됨.
console.log(typeof a); // object
console.log(typeof a2); // boolean
위 과정에서 === 를 사용하여 비교하게 되면 둘은 다르게 나온다.
둘의 타입이 다르기 때문이다.
하지만 valueOf() 를 통해 unboxing을 한다면
unboxing된 값은 원시 타입이기 때문에, Success 를 출력하게 된다.
const a = new Boolean(false);
const a2 = false;
if(a.valueOf() === a2) {
console.log('Success');
} else {
console.log('Fail');
}
// Success 출력
// == 연산에서는 타입 비교가 아닌 값의 비교이기 때문에 true 가 출력되는거다.
console.log(a === a2); // Fail
console.log(a == a2); // Success
'개발 > JavaScript' 카테고리의 다른 글
Set 객체: 값의 고유한 집합 저장소 (1) | 2023.12.17 |
---|---|
개인적인 This 정리 (1) | 2023.09.24 |
클래스를 이용한 모듈화 (0) | 2023.07.01 |
생성자 함수와 프로토타입의 차이? (0) | 2023.06.23 |
Array.prototype.reduce() (0) | 2023.05.07 |
@bokueyo :: 기록하는 습관
개발 블로그
포스팅이 좋았다면 "좋아요❤️" 누르기 !