2011-10-21 3 views
8
jQuery(); //[] 
jQuery("#footer"); //[<div id="footer">...</div>] 

난 당신이 이런 식으로 뭔가를 할 수 있다는 사실을 알고 :jQuery는 반환 값을 배열처럼 어떻게 보이나요?

function kablam(tag) { 
    var els = document.getElementsByTagName(tag); 
    els.isKablam = true; 
    return els; 
} 
var body = kablam("body"); //[<body class="ask-page">...</body>] 
body.isKablam; //true 

document.getElementsByTagName에서 반환 된 NodeList의 "확장"버전을 반환합니다.

그러나 jQuery는 그 반대입니다. 결과를 자체에 병합합니다 (herehere 참조). 또한, 그것은 당신이 그것에 아무것도 통과하지 않는 경우는 배열과 같은 객체, 즉-외모 같은-AN-배열을 반환하는 방법을 설명하지 않습니다

jQuery(); //[] 

당신이 jQuery를 단순히 그 자체를 반환, 그렇게합니다. (source)

또는 동일로는 body 태그를 선택하면, 확장

: 전혀 생각 올

jQuery("body"); //[<body class="ask-page">...</body>] 

(source)

또는 아무것도 :

var o = {}, body = document.getElementsByTagName("body"); 
jQuery.merge(o, body); //Object, not [...] 

숫자와 같은 키를 할당하는 것이 쉽고 다른 키를 지정하는 것과 다르기 때문에 배열과 같은 객체를 반환하는 것은 매우 쉽습니다. 하지만 jQuery는 어떻게 배열처럼 보이게합니까?

답변

7

배열과 같이 표시하기 위해 프로토 타입에 .length, .splice.push을 정의해야합니다.

배열 방법의 다른 조합도 사용할 수 있습니다.

Example

+1

나는'.push'가 필요 없다고 꽤 확신한다. :) –

+1

또한, 프로토 타입에있을 필요는 없다. 콘솔에서 이것을 시도해보십시오 :'a = {length : 0, splice : function()}' – Shmiddty

0

귀하의 의견으로는 "배열과 유사합니까?" 배열을 어떻게 확인 하시겠습니까? 길이가있는 모든 것을 배열로 간주하면 array와 같이 객체를 만드는 데 필요한 모든 것이 length 속성을 정의하는 것입니다. jQuery가 그렇게합니다.

+0

그래서 저는 array-like와 array-look-like를 분리했습니다. 배열과 같은 것은 길이와 숫자 인덱스를 가지고있는 것으로 간주됩니다 (둘 다하기 쉽지 않습니다). array-look-alike에 대한 가장 짧은 대답은 당신이 그것을 기록 할 때 당신이 배열을보고 있다고 생각한다는 것입니다. – Zirak

+0

@bjornd는이 경우 "배열처럼 보입니다"는 의미로 브라우저의 디버거/콘솔/dev-tools는 배열로 인쇄합니다. – Raynos

+0

@Zirak, @Raynos 따라서 디버거/콘솔/dev-tools가 사물. 예를 들어'object instanceof Array'를 검사하거나 길이 또는 다른 배열 특정 속성을 검사 할 수 있습니다. – bjornd

관련 문제