1.typeof 연산자. 함수, 문자열, 숫자, 정의되지 않음 등과 같은 여러 유형의 객체에 대해 그는 모든 기능을 수행할 수 있지만 배열인 경우에는 용법: 결과 = 객체 인스턴스 클래스, 지금은 여전히 배열입니다. 다시 시도해 보세요. 음, 성공적으로 true를 반환합니다.
var arr=new Array("1","2","3","4","5"); alert(typeof(arr));
간단한 요약: 오늘 논의한 질문에 대한 답이 나온 것 같지만 실제로는 두 가지 사이를 오가는 중입니다. 다중 프레임
var arrayStr=new Array("1","2","3","4","5"); alert(arrayStr instanceof Array);
는 두 개의 False 결과를 반환하는데 이는 매우 실망스럽습니다.
ECMA-262는
Object.prototype.toString( )을 작성했습니다. toString 메소드가 호출되면 다음 단계가 수행됩니다.var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有 alert(arr instanceof Array); // false alert(arr.constructor === Array); // false
2.
세 개의 문자열 “[object”, Result (1) 및 “]” 연결
3.
결과(2)
위 사양은 Object.prototype.toString의 동작을 정의합니다. 먼저 객체의 내부 속성 [[Class]]을 얻은 다음 "[object와 유사한 객체를 반환합니다.
Array]" 문자열을 결과로 반환합니다(ECMA 표준을 읽은 사람이라면 [[]]가 언어 내부적으로 사용되며 외부에서 직접 접근할 수 없는 속성("내부 속성"이라고 함)을 나타내는 데 사용된다는 것을 알아야 합니다.) 이 방법을 사용하여 , 호출을 통해 모든 객체의 내부 속성 [[Class]]을 얻은 다음 유형 감지를 문자열 비교로 변환하여 목적을 달성할 수 있습니다. 먼저 ECMA 표준의 Array에 대한 설명을 살펴보겠습니다.
ECMA-262는
new Array([ item0[, item1 [,…]]])
[[Class]] 속성을 썼습니다.
새로 생성된 객체는 "배열"로 설정됩니다.
이를 활용하여 세 번째 방법이 나타납니다.
function isArray(obj) {
return Object.prototype.toString.call(obj) ===
'[객체 배열]'
}
호출은 toString의 this 참조를 감지할 개체로 변경하고 이 개체의 문자열 표현을 반환한 다음 이 문자열이 '[object]인지 비교합니다.
Array]'를 사용하여 Array의 인스턴스인지 확인합니다. 어쩌면 o.toString()을 직접적으로 물어보는 것이 어떨까요? Array는 Object에서 상속되지만 toString 메서드도 가지게 되지만 이 메서드는 다시 작성되어 요구 사항을 충족하지 못할 수 있으며 Object.prototype은 호랑이 엉덩이이므로 감히 건드릴 사람이 거의 없습니다. 어느 정도 "순수함"을 보장할 수 있습니다 :)
이전 솔루션과 달리 이 방법은 크로스 프레임 객체 구성 문제를 매우 잘 해결했으며, 테스트 결과 주요 브라우저의 호환성도 매우 우수하므로 안심하고 사용할 수 있습니다. 좋은 소식은 jQuery, Base2 등과 같은 많은 프레임워크가 이 방법을 사용하여 배열, 정규식 등과 같은 특정 유형의 특수 객체를 직접 작성할 필요 없이 구현할 계획이라는 것입니다.
또한 Ext3도 이런 방식으로 변경되었습니다