>웹 프론트엔드 >JS 튜토리얼 >JavaScript는 객체가 객체인지 배열인지 결정합니다.

JavaScript는 객체가 객체인지 배열인지 결정합니다.

黄舟
黄舟원래의
2016-12-12 15:21:001264검색

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
1. 이 객체의 [[클래스]] 속성

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도 이런 방식으로 변경되었습니다




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