isXXX 방식의 유형 판단

2408 단어 유형 판단
만약 대상이 Array 유형인지 아닌지를 판단해야 한다면 일반적으로 어떻게 할까요?
function isArray(obj){

	return obj instanceof Array;

}


혹은 유사한
function isArray(obj){

	return obj.constructor === Array;

}


기초 지식 보충, 고수 무시~
A instanceof B  :

 A B prototype, , true; , false。 , B prototype null 。

function A(){	

}

function B(){



}

A.prototype = new B();	//A.prototype.__proto__ === B.prototype, instanceof 

var a = new A();

a instanceof B;  		// true

 , B A ( ...), true, false。
constructor  :

function A(){}

A.prototype.constructor

 A, , , A.prototype.constructor = {}

이 두 가지 방법은 수요를 해결한 것 같지만 앞부분의 난이도는 여러 가지 끊임없이 나타나는 문제에 있다. 이번에도 마찬가지다. 만약에 한 그룹이 다른 프레임에서 온다면constructor는 다른 대상이 될 것이다.
var iframe = document.createElement('iframe');   

document.body.appendChild(iframe);   

iArray = window.frames[window.frames.length-1].Array;   

var arr = new iArray(1,2,3);  

console.log(arr instanceof Array);

console.log(arr.constructor === Array); 

console.log(arr.constructor)


  
결과는 다음과 같습니다.
Chrome:false  false  function Array() { [native code] }
FireFox6:true  true  [undefined]
   Opera:false  false  function Array() { [native code] }
  Safari:true  true  function Array() { [native code] }
     IE9:false  false  function Array() { [native code] }
좋아, 나는 내가 이 데이터를 몹시 아프게 테스트한 것을 인정한다. 어쨌든 결론은 위의 두 가지 판단 방식이 좋지 않다는 것이다.
위대한 네티즌 감사합니다. 이미 누군가가 ECMA-262의 근거를 찾았습니다.
Object.prototype.toString( ) When the toString method is called, the following steps are taken: 

1. Get the [[Class]] property of this object. 

2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”. 

3. Return Result (2) 


개체를 호출합니다.prototype.toString() 시 js 엔진은 다음과 같이 합니다.
  1. 대상의 내부 속성 [[[Class]]를 획득하고 c로 잠시 이름을 지정합니다.([]] 언어 내부에서 사용되고 외부에서 직접 접근할 수 없는 속성을 나타내는 데 사용되며, 이를 "내부 속성"이라고 부른다)
  2. "[object", c, "] 세 문자열 연결
  3. 결과 반환
이 방법을 이용하여call에 협조하면 우리는 모든 대상의 내부 속성[[[Class]]을 얻고 유형 검사를 문자열 비교로 바꾸어 우리의 목적을 달성할 수 있다.
최종판
function isArray(obj){

	return Object.prototype.toString.call(obj) === '[object Array]';

}


이미 라이브러리에서 이 방법을 사용하고 있기 때문에 우리는 안심하고 사용할 수 있다.
다른 대상, 예를 들어 RegExp도 유사하게 판단할 수 있다.

좋은 웹페이지 즐겨찾기