2012-07-09 5 views
5

npWartość zwracana przez jQuery to Array, ale konstruktorem jest Object. w jaki sposób?

$(document) // [ #document ] : document object in array 
typeof $(document) // "object" 
$(document).constructor // function Object() { [native code] } or function (a,b) { return some function; } 

Jeśli wartość jest tablicą, to musi być konstruktor macierzy.

To nie jest tablica jak obiekt. ponieważ tablica jak obiekt ma właśnie właściwość tablicy, a nie jak [].

Jak to możliwe?

dodaj: Jeśli możesz, pokaż prosty przykładowy kod, proszę. jak

a = ... 
console.log(a) // [ ... ] 
console.log(a.constructor) // function Object or something 
+0

Nie rozumiem twojego rozumowania, dlaczego zwrot z '$ (dokument)' nie jest "obiektem typu tablica" - jeśli spojrzysz na faktyczne źródło jQuery, znajdziesz je jako tablicę obiekt i _nie_ tablica ... – nnnnnn

+0

@nnnnnn, ponieważ obiekt tablicowy nie jest wyświetlany jako [] – Ephemera

+0

"Pokazano" gdzie? Zwrot z '$ (document)' jest instancją 'jQuery.fn.init', która ma dodane właściwości' 0' i 'length'. Jeśli był to 'Array', to miałby metody tablicowe takie jak' .join() ', a nie ma. _Spójrz na kod źródłowy. – nnnnnn

Odpowiedz

3

Spójrz na jQuery source. $(document) tworzy sklonowany obiekt jQuery elementu document, a następnie tworzy i zwraca wartość array-like object.

jQuery funkcja fabrycznie $() zwraca się obiekt, który ma wiele jQuery właściwości tablicy (długość w [] operatorowi dostępu do tablicy, ), ale nie jest dokładnie taki sam, jak tablica i brakuje niektórych z wbudowanych metod tablicowych (takich jak .pop() i .reverse()).

+0

Teraz jestem zdezorientowany. Jeśli zwraca tablicę obiektów, to czy jej konstruktor nie ma funkcji "function Array() {// ..}"? – boring

+1

Nie tworzy ani nie zwraca tablicy, zwraca instancję 'jQuery.fn.init' po dodaniu właściwości' 0' i 'length'. Oznacza to, że zwraca obiekt podobny do tablicy. – nnnnnn

+0

Wyjaśniona odpowiedź. – RobB

0

tablicy, jak w [] jest również przedmiotem JavaScript. W JS przeważnie wszystko jest obiektem, takich jak funkcje, tablice, dosłownych obiektów, wyrażeń regularnych ... naprawdę wiedzieć, co masz do czynienia z jest tablicą można to zrobić:

Object.prototype.toString.apply(myarray) === '[object Array]' 
Powiązane problemy