isXXX 방식의 유형 판단
2408 단어 유형 판단
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도 유사하게 판단할 수 있다.