holdanddeepdive/javascript-deep-dive

[아티클] 자바스크립트 원시값의 비밀?!

Opened this issue · 0 comments

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

원시 타입은 속성이 없는데 왜 "abc".length는 값을 반환할까?

  • 자바스크립트는 원시 타입과 객체를 쉽게 강제변환
  • 문자열 값은 length라는 프로퍼티에 접근했기 때문에 문자열 객체로 강제변환
  • 문자열 객체는 찰나의 순간에만 사용되고 바로 가비지 콜렉션에 의해 수집됨
String.prototype.returnMe= function() {
    return this;
}

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

a; //"abc" 
typeof a; //"string" (still a primitive)
b; //"abc"
typeof b; //"object"
Number.prototype.toString = function() {
    return typeof this;
}

(123).toString(); //"object"
  • 이러한 방법을 통해 원시타입은 각자의 객체 생성자가 정의한 메소드를 포함한 모든 프로퍼티에 접근할 수 있음

형변환을 이용하여 원시 타입에 값을 할당할 수 있을까?

그렇지 않다

var primitive = "september";
primitive.vowels = 3;

primitive.vowels; //undefined; 
  • 자바스크립트가 원시 타입에 프로퍼티를 할당하는 것을 감지한다면 원시 타입을 객체로 강제 형변환시켰을 것
  • 그러나 위의 예시처럼 새로운 객체는 참조값이 없고 즉시 가비지 콜렉션에 의해 수집됩니다.
var primitive = "september";
primitive.vowels = 3;
// 생성된 새로운 객체에 프로퍼티 셋
(new String("september")).vowels = 3;

primitive.vowels;
// 또 다른 객체가 생성되고 이 객체에서 프로퍼티를 찾음
(new String("september")).vowels; //undefined