https://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/

 

The Secret Life of JavaScript Primitives

You may not know it but, in JavaScript, whenever you interact with string, number or boolean primitives you enter a hidden world of object shadows and coercion. So dust off your Sherlock Holmes out…

javascriptweblog.wordpress.com

 

객체는 특성(Property)들의 집합이고 특성으로 객체와 기초요소(Primitive)를 추론할 수 있다. 

Primitive는 특성을 갖지 않은 값이라고 할 수 있다.

 

자바스크립트에서는 5개의 기초 타입이 있다. undefined, null, boolean, string, number

그 밖의 나머지 타입은 객체이다. 기초타입이 아니다.

기초타입인 boolean, string, number은 보통 객체에 감싸져 있고 객체들은 생성자에 의해 인스턴스화 되어 있다.

 

 

그럼 어떻게 기초타입인 abc에서 abc.length를 하면 값을 반환할까? 특성을 갖고 있지 않는데 어떻게 ?

 

자바스크립트는 기초요소와 객체를 강제한다. String타입인 primitive abc는 .length 값을 반환하기 위해 객체에 묶여진다. 자바스크립트가 그렇게 한다. 이 묶인 객체는 아주 잠깐( length값을 반환하는 순간 ) 존재하다가 가비지콜렉션에 의해 지워진다.

 

예제이다.

String.prototype.returnMe = () => this;

var a = "abc";
var b = a.returnMe();

a; // "abc"
typeof a; // "String" ( 이건 기초요소 )

b; // "abc"
typeof b; // "object"

선언된 변수 a는 기초타입인 string이다. b는 변수 a를 받아서 자신이 뭔지 반환하는 메소드이다.

a의 타입은 string으로 출력이 되는데 b는 객체로 출력이 된다. 이유는 b에서 .returnMe()라는 메소드를 만들어 잠시 존재하는 객체를 붙잡았기 때문이다. 

 

a는 객체가 abc를 반환하고 GC에 의해 처리됬는데 b는 객체가 GC되지 않았다.

(strict mode에서는 b도 GC된단다.)

 

그니까 기초타입에서 값을 직접 반환하지 않고 객체가 반환한다는 얘기인거 같다.

 

 

근데 이걸 왜 알아야 하냐 ???

 

나중에 자바스크립트를 갖고 놀려면 알아야 하기도 하고, 당장은 될 것 같은 코드에서 에러가 왜 나는지 이해하는데 도움이 될 것이다.

 

예를 들어 이런 상황이다.

var hi = "hello";
hi.sad = 1;

hi.sad; // undefined

hi라는 변수에 String hello를 집어 넣었다. 여기에 또 .sad를 하여 객체를 생성하여 1을 집어 넣었다. 

근데 hi.sad가 왜 1이 반환되는게 아니고 undefined일까 ??

 

위의 예제를 풀어서 보면 아래와 같다.

var hi = "hello";
hi.sad = 1;

// 1을 넣기 위해 새로운 객체를 생성
(new String("hello")).sad = 1;

hi.sad;
// 호출되었으니까 다시 객체 생성
(new String("hello")).sad; // undefined

hi객체가 .sad에 1을 넣었다 한들 가비지콜렉션 대상이 되서 사라졌다. 새롭게 생성된 객체에 있을리 만무한 .sad를 호출 했기 때문에 undefined가 뜬 것이다.

 

 

솔직히 지금 당장 primitive type에 대해 이해하고 코드를 작성하는건 힘들지 몰라도 내가 쓴 코드에 에러가 나고 그게 자바스크립트의 이 특성 때문이라는 걸 알고 있다는게 중요한 것이다. 모르는걸 알면 찾으면 되니까...

+ Recent posts