>웹 프론트엔드 >JS 튜토리얼 >JavaScript는 객체가 배열 메소드 요약인지 여부를 결정합니다.

JavaScript는 객체가 배열 메소드 요약인지 여부를 결정합니다.

伊谢尔伦
伊谢尔伦원래의
2017-07-26 11:41:031404검색

개발 중에 객체가 배열 유형인지 확인해야 하는 경우가 많습니다.

1.typeof 연산자는 Function, String, Number, Undefine 등과 같은 여러 유형의 객체에 대해 완전히 가능하지만, Array

var arr=new Array("1","2","3","4","5"); 
alert(typeof(arr));

객체 답변을 받게 되는데, 이는 다소 실망스럽습니다.

2.instanceof 연산자, JavaScript의 instanceof 연산자는 객체가 특정 클래스의 인스턴스인지 여부를 나타내는 부울 값을 반환합니다.
사용법: 결과 = 클래스 인스턴스 객체, 지금은 여전히 ​​배열입니다. 다시 시도해 보세요. 음, 성공적으로 true를 반환합니다.

var arrayStr=new Array("1","2","3","4","5"); 
alert(arrayStr instanceof Array);

간단한 요약: 오늘 논의한 문제는 해결된 것 같지만 실제로는 여러 가지 문제가 있습니다. 프레임 중간에 셔틀이 있으면 큰 문제가 발생합니다.

Code

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.prototype.toString의 동작을 정의합니다. object Attribute [[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) === '[object Array]'; 
}


위 내용은 JavaScript는 객체가 배열 메소드 요약인지 여부를 결정합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.