2011-02-09 12 views
14

Kiedy pracuję w jQuery, często umieszczam selektory w konsoli Chrome/Firebug i widzę, co mi dają. Są one zawsze ładnie sformatowane tak, jakby były tablice:Co sprawia, że ​​konsola Firebug/Chrome traktuje niestandardowy obiekt jako tablicę?

Chrome's console shows a jQuery selection as an array

staram się zorientować, co to jest, że sprawia, że ​​konsola traktować obiektu jako tablica. Na przykład, następujące niestandardowy obiekt nie jest traktowana jako tablicy:

function ElementWrapper(id) { 
    this[0] = document.getElementById(id); 
} 

Chrome's console shows the object as a normal object

Jeśli następnie dodać length właściwość i pewną metodę splice, niespodziewanie działa jako matrycy, z właściwościami z całkowitej klucze traktowane jako członkowie tablic:

function ElementWrapper(id) { 
    this[0] = document.getElementById(id); 
    this.length = 1; 
    this.splice = Array.prototype.splice; 
} 

Chrome's console shows the object as if it was an array

Więc zasadniczo moje pytanie brzmi: co określa, czy konsola wyświetla obiekt jako tablicę? Czy jest jakaś racjonalna przesłanka, czy też jest to całkowicie arbitralne "jeśli obiekt ma te właściwości, musi to być tablica?" Jeśli tak, jakie są decydujące właściwości?

Odpowiedz

18

To co robi isArray metoda Firebug za: (od Firebug source)

if (!obj) 
    return false; 
else if (isIE && !isFunction(obj) && typeof obj == "object" && isFinite(obj.length) && obj.nodeType != 8) 
    return true; 
else if (isFinite(obj.length) && isFunction(obj.splice)) 
    return true; 
else if (isFinite(obj.length) && isFunction(obj.callee)) // arguments 
    return true; 
else if (instanceOf(obj, "HTMLCollection")) 
    return true; 
else if (instanceOf(obj, "NodeList")) 
    return true; 
else 
    return false; 

Oczywiście, żadna z tych kontroli zapewnia, że ​​obiekt jest prawdziwą tablicą JavaScript, ale robią rozsądną pracę zgadywać czy obiekt jest pseudo-tablicą, co z kolei daje wygodną reprezentację tablicową do debugowania.

Chrome może lub nie może używać tych samych kontroli, a nowa konsola internetowa w Firefoksie 4 nie rozpoznaje niczego poza prawdziwymi tablicami jako tablicami.

+0

Wielkie dzięki - to wspaniała odpowiedź! – lonesomeday

+0

Więc dla wyniku selekcji jquery, który z nich jest prawdziwy? – Aliostad

+0

@Aliostad '.length' i' .splice', jak pokazano w moim OP. – lonesomeday