2011-10-21 56 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)。此外,這也無法解釋當你通過什麼給它如何返回一個類似數組的對象,也就是說,看起來樣的陣列:

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

你認爲什麼是「看起來像一個陣列」?你將如何檢查數組?如果你認爲所有的長度都是數組,那麼你所需要的所有東西看起來像是數組,就是定義長度屬性。 jQuery做到了。

+0

這就是爲什麼我分開數組和類似數組的原因。類似數組被認爲具有長度和數字索引(這兩者都是微不足道的)。陣列外觀最短的答案是,當你登錄它時,你認爲你正在查看一個數組。 – Zirak

+0

@bjornd在這種情況下「看起來像一個數組」意味着瀏覽器中的調試器/控制檯/開發工具將其打印爲數組 – Raynos

+0

@Zirak,@Raynos因此,它完全取決於調試器/控制檯/開發工具如何處理對象。例如,他們可以檢查'object instanceof Array'或檢查長度或另一個數組特定的屬性。 – bjornd

相關問題