기초
당신은 그것을 모를 수도 있지만, JavaScript에서 우리가 문자열, 숫자 또는 부울 프리미티브와 상호 작용할 때마다 우리는 객체 그림자와 강제의 숨겨진 세계로 들어갑니다.
문자열, 숫자, 부울, 널, 정의되지 않음 및 기호.
자바 스크립트에서 7 개 기본 유형이있다 : undefined, null, boolean, string, number, bigint와 symbol. 다른 모든 것은 객체입니다. 기본 유형 boolean, string및 number해당 객체 대응 요소로 래핑 할 수 있습니다. 이러한 개체는 각각 Boolean, String및 Number생성자의 인스턴스입니다 .
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
프리미티브에 속성이없는 경우 왜 "this is a string".length값을 반환합니까?
JavaScript는 프리미티브와 객체 사이를 쉽게 강제하기 때문입니다. 이 경우 속성 길이에 액세스하기 위해 문자열 값이 문자열 개체로 강제 변환됩니다. 문자열 객체는 가비지 수집의 신들에게 희생 된 후 몇 초 동안 만 사용됩니다. 그러나 TV 발견 쇼의 정신에 따라 찾기 어려운 생물을 가두 고 추가 분석을 위해 보존 할 것입니다.
이를 더 설명하기 위해 String 생성자 프로토 타입에 새 속성을 추가하는 다음 예제를 고려하십시오.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
즉, 프리미티브는 각각의 객체 생성자가 정의한 모든 속성 (메서드 포함)에 액세스 할 수 있습니다.
그래서 우리는 필요에 따라 기본 유형이 각각의 Object 대응 물로 적절하게 강제되는 것을 보았습니다.
toString()방법 분석
다음 코드를 고려하십시오.
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
위에서 논의한 바와 같이, 실제로 일어나는 일은 우리 toString()가 원시 유형에 대해 메소드를 호출 할 때 , 메소드를 호출하기 전에 객체 대응으로 강제 변환되어야한다는 것입니다.
즉 , 다른 기본 유형과 myNumber.toString()동일 Number.prototype.toString.call(myNumber)하고 유사합니다.
그러나 기본 유형이 toString()해당 Object 생성자 함수 대응 메소드에 전달되는 대신에 기본 유형이 toString()Object 함수 생성자 ( Object.prototype.toString.call(x))의 메소드에 매개 변수로 전달되도록 강제하면 어떻게 될까요?
Object.prototype.toString () 자세히 살펴보기
당으로 문서 toString 메소드가 호출되면, 다음 단계가 수행됩니다
- 는 IF
this값이 undefined반환 "[object Undefined]".
- 는 IF
this값이 null반환 "[object Null]".
- 이 값이 위의 값이 아닌 경우 값을 인수로 전달하는
O호출 결과가 됩니다.toObjectthis
- class를의
[[Class]]내부 속성 값으로 지정합니다 O.
- 세 개의 문자열을 연결의 결과 인 문자열 값 반환
"[object ", class등을 "]".
다음 예제에서 이것을 이해하십시오.
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
참조 :
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010 / 09 / 27 / 자바 스크립트 프리미티브의 비밀 생활 /