원시 자바스크립트의 비밀스런 삶 - Lee-hyuna/33-js-concepts-kr GitHub Wiki
객체는 속성의 집합입니다.
속성은 객체 또는 primitive를 참조할 수 있습니다.
primitives는 속성이 없는 값입니다.
자바스크립트에는 undefined, null, boolean, string 및 number 의 5가지 기본 유형이 있습니다.
다른 모든 것은 객체입니다.
boolean, string, number 의 원시적인 타입은 객체 대응으로 감쌀 수 있습니다.
이러한 객체는 각각 Boolean, String, Number 생성자의 인스턴스 입니다.
typeof true; //"boolean"
typeof Boolean(true); //"boolean"
typeof new Boolean(true); //"object"
typeof (new Boolean(true)).valueOf(); //"boolean"
typeof "abc"; //"string"
typeof String("abc"); //"string"
typeof new String("abc"); //"object"
typeof (new String("abc")).valueOf(); //"string"
typeof 123; //"number"
typeof Number(123); //"number"
typeof new Number(123); //"object"
typeof (new Number(123)).valueOf(); //"number"
자바스크립트는 기본요소와 객체를 쉽게 강제 변환하기 때문이다.
이 경우 문자열 값은 속성 길이에 액세스하기 위해 문자열 객체로 강제 변환된다.
문자열 객체는 가비지 콜렉션의 신들에게 희생 된 후 몇 초 동안 만 사용된다.
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"
많은 훌륭한 의미의 과학적 조사와 마찬가지로 우리는 이제 사물의 자연스러운 진행을 방해하고
b가 주변에있는 한 대상물이 쓰레기 수거되는 것을 막았습니다.
다음은 가비지 수집을 방해하지 않고 객체 유형을 확인하는 환경 적으로 책임있는 예제입니다.
Number.prototype.toString = function() {
return typeof this;
}
(123).toString(); //"object"
그러면 프리미티브는 각각의 객체 생성자에 의해 정의 된 모든 속성 (메소드를 포함)에 액세스 할 수 있습니다.
그렇습니다. 대개. 이 유형의 객체는 래퍼 일뿐이며 값은 래핑하는 프리미팁이며 필요에 따라 이 값으로 강제 축소합니다.
자세한 내용은 이 기사를 참조하십시오.
//object coerced to primitive
var Twelve = new Number(12);
var fifteen = Twelve + 3;
fifteen; //15
typeof fifteen; //"number" (primitive)
typeof Twelve; //"object"; (still object)
//another object coerced to primitive
new String("hippo") + "potamus"; //"hippopotamus"
//object not coerced (because 'typeof' operator can work with objects)
typeof new String("hippo") + "potamus"; //"objectpotamus"
슬프게도 boolean 객체는 쉽게 가용하지 않습니다.
그리고 부상에 모욕을 더하기 위해서 부울 객체는 값이 null이거나 정의되지 않은 경우 true로 평가된다.
if (new Boolean(false)) {
alert("true???");
}
보통 명시적으로 값에 대한 boolean을 요청해야한다.
다음은 그 값이 "진실"인지 "거짓"인지를 결정하는데 유용 할 수 있습니다.
var a = "";
new Boolean(a).valueOf(); //false
실제로 이것을 더 쉽게 하면
var a = Boolean("");
a; //false
또는
var a = "";
!!a; //false
아니요
var primitive = "september";
primitive.vowels = 3;
primitive.vowels; //undefined;
자바스크립트가 속성을 primitive에 할당하려는 시도를 감자히면 실제로 primitive를 객체로 강제 변환합니다.
그러나 이전 예제와 마찬가지로 이 새 객체에는 참조가 없으며 즉시 가비지콜렉션의 먹이가 됩니다.
실제 발생 상황을 보여주는 동일한 예제의 의사코드 표현입니다.
var primitive = "september";
primitive.vowels = 3;
//new object created to set property
(new String("september")).vowels = 3;
primitive.vowels;
//another new object created to retrieve property
(new String("september")).vowels; //undefined
당신도 볼 수 있듯이, 이것은 쓸모없는 예쁜 낭비 입니다.
프로퍼티를 할당하는 기능은 원시 primitive와 비교할 때 객체의 유일한 장점 일 뿐이지만
실제로는 모호한 품질입니다. String, boolean, number 는 구체적이고 잘 정의 된 목적을 가지고 있으며
이해 관계자로 재정의하면 사람들을 혼란에 빠뜨리기 쉽습니다.
또한 primitives는 불변이므로 객체 래퍼의 속성을 조정하여 수정할 수 없습니다.
var me = new String("Angus");
me.length = 2; //(error in strict mode)
me.length; //5 (not 2 - thanks @joseanpg)
me.valueOf(); "Angus"
그럼에도 불구하고, 나는 primitives에 대한 좋은 이해와 상호 작용할 때 커버 아래에서 일어나는 일이
언어에 대한 더 깊은 지식을 향한 중요한 단계라고 생각합니다.