1. Typeof 연산자는 Function, String, Number, Undefine 등 여러 유형의 객체에 대해 완전한 능력을 갖고 있지만 Array
var arr=new Array("1","2","3","4", "5");
alert(typeof(arr));
약간 실망스러운 개체 응답을 받게 됩니다.
2.instanceof 연산자, instanceof JavaScript 연산자의 연산은 객체가 특정 클래스의 인스턴스인지 여부를 나타내는 부울 값을 반환합니다.
사용 방법: 결과 = 클래스 객체 인스턴스, 지금은 여전히 배열입니다. 다시 시도해 보세요.
var arrayStr=new Array("1","2","3","4","5")
Alert(arrayStr instanceof Array );
간단히 요약: 오늘 논의한 질문에 대한 답변이 된 것 같지만 실제로는 여러 프레임 사이를 이동하면 큰 문제가 발생합니다.
코드
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
반환 결과는 False 2개로 실망스럽습니다.
ECMA-262는
Object.prototype.toString( ) toString 메소드가 호출되면 다음 단계를 수행합니다.
1. 이 객체의 [[Class]] 속성을 가져옵니다.
2. "[object ", Result (1) 및 "]" 세 문자열을 연결하여 문자열 값을 계산합니다.
3. Return Result (2)
위 사양은 Object를 정의합니다. 프로토타입.toString: 먼저 객체의 내부 속성 [[Class]]를 얻은 다음 이 속성을 기반으로 한 결과로 "[object Array]"와 유사한 문자열을 반환합니다(ECMA 표준을 읽은 사람은 알아야 함) 즉, [[]]는 언어 내부적으로 사용되며 외부에서 직접 접근할 수 없는 속성("내부 속성"이라고 함)을 나타내는 데 사용됩니다. 호출과 결합된 이 방법을 사용하면 모든 객체의 내부 속성 [[Class]]을 얻은 다음 유형 감지를 문자열 비교로 변환하여 목적을 달성할 수 있습니다. 먼저 ECMA 표준의 Array에 대한 설명을 살펴보겠습니다.
ECMA-262는
new Array([ item0[, item1 [,…]]])
[[Class]] 속성을 씁니다. 새로 생성된 객체는 "배열"로 설정됩니다.
이를 활용하여 세 번째 방법이 나타납니다.
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]'
} 호출은 toString의 this 참조를 감지할 객체로 변경합니다. 그런 다음 이 객체의 문자열 표현을 비교하여 이 문자열이 '[object Array]'인지 확인하고 이것이 Array의 인스턴스인지 여부를 결정합니다. 어쩌면 o.toString()을 직접적으로 물어보는 것이 어떨까요? Array는 Object에서 상속되지만 toString 메서드도 가지게 되지만 이 메서드는 다시 작성되어 요구 사항을 충족하지 못할 수 있으며 Object.prototype은 호랑이 엉덩이이므로 감히 건드릴 사람이 거의 없습니다. 어느 정도 "순수함"을 보장할 수 있습니다 :)
이전 솔루션과 달리 이 방법은 크로스 프레임 객체 구성 문제를 매우 잘 해결했으며, 테스트 결과 주요 브라우저의 호환성도 매우 좋습니다. 안심하고 사용하실 수 있습니다. 좋은 소식은 jQuery, Base2 등과 같은 많은 프레임워크가 이 방법을 사용하여 배열, 정규식 등과 같은 특정 유형의 특수 객체를 직접 작성할 필요 없이 구현할 계획이라는 것입니다.
또한 Ext3도 이렇게 작성했습니다
isArray : function(v){
return toString.apply(v) === '[객체 배열]'
}