본문 바로가기
JavaScript

[JavaScript] Wrapper Object

by 배잼 2022. 2. 23.

모던 자바스크립트 Deep Dive 21장을 읽으며 정리한다.

문자열이나 숫자, 불리언 등의 원시값이 있는데도 불구하고, String, Number 등의 표준 빌트인 생성자 함수가 존재하는 이유는?

 

 

궁금했던 질문이기에 웅장하게 인용해봤다.

또, 평소 아무렇지 않게 사용했던 문자열 관련 property와 method... 생각해보면 객체처럼 동작하고 있지 않은가? 원시값은 객체가 아닌데?

const str = 'Fruit';

console.log(str.length); // property처럼 생겼다!?
console.log(str.toUpperCase()); //FRUIT, method처럼 생겼다?!

되돌아보니까 정말 object처럼 쓰고 있었다! 왜 이게 되는 걸까?

→ 원시 값을 객체처럼 사용하면, JS 엔진은 암묵적으로 연관된 객체를 생성한다. 생성된 객체로 property에 접근하거나 method를 호출하고, 다시 원시값으로 되돌린다.

Wrapper Object: 문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체

 

위의 경우, String constructor의 instance가 생성된다. 그 instance는 String.prototype 의 method를 상속받아 사용할 수 있다.

그러나 암묵적으로 생성된 wrapper object에 property를 할당하더라도, 제대로 작동하지 않는다

(rough하게 얘기하면, 다시 원시값으로 되돌리는 과정에서 생성된 instance는 아무도 참조하지 않게 된다. 그리고 만약 다시 property를 할당할 때 생성된 instance는 아까와 다른 친구다.)

전역 객체 메모

  • ver 키워드로 선언한 전역 변수, 선언하지 않은 변수에 값을 할당한 암묵적 전역, 전역 함수는 전격 객체의 property다.
  • 브라우저 환경의 모든 JS code는 하나의 전역 object window를 공유한다. (분리되어 있어도 말이다!)
  • eval() : 전달받은 문자열 코드가 표현식이라면 문자열 코드를 런타임에 평가해서 값을 생성, 아니라면 런타임에 실행
  • eval 함수는 기존의 스코프를 런타임에 동적으로 수행 (더 알아보기)

댓글