2017-02-18 12 views
6

mam uruchomić następujące wiersze w mojej konsoli (raz skrypt jquery został załadowany) i otrzymał następujące wyniki:

$(this) 
> [Window] 
$(this) != $(this) 
> true 
$(this) == $(this) 
> false 
$(this) === $(this) 
> false 

I nie wiem, jakie kroki podjąć, aby dowiedzieć się, co się dzieje na. Domyślam się, że istnieje jakiś obiekt, który posiada wartość czasową, która się zmienia, ale zastanawiam się, czy to coś innego. Spróbuję porównać wartości w międzyczasie, ale miałem nadzieję, że ktoś może zrozumieć, co tu się dzieje.

Edytowane w celu rozwiązania problemu, który nie był świadomy podstawowej realizacji $ (arg). Nie wiedziałem, że zwrócił nowy obiekt referencyjny. Dlatego nie uważam, że jest to duplikat "Jak określić równość dla dwóch obiektów JavaScript?".

+0

http://stackoverflow.com/questions/201183/how-to-determine-equality-for- two-javascript-objects – j08691

+1

_ "Spróbuję porównać wartości w międzyczasie" _ Czego próbujesz ustalać? – guest271314

+1

@ guest271314 Porównywanie w celu sprawdzenia, czy wszystkie właściwości mają taką samą wartość. Teraz widzę, że javascript równa się ocenia w oparciu o samą równość ORAZ że $ (this) zwraca nowe odwołanie za każdym razem, gdy jest wywoływane. Dlatego, Baao, nie sądzę, że to jest duplikat. Nie zdawałem sobie sprawy, że $ (this) zwrócił za każdym razem nowy obiekt referencyjny do "tego" i nie jest to adresowane w połączonym pytaniu. – NicholasFolk

Odpowiedz

6

Użycie $() zwraca instancję jQuery. Tworzysz więc jedną instancję z this i inną instancją this, masz dwie osobne instancje. Mimo że mają one to samo odniesienie do this, instancje nie są takie same, a te właśnie są porównywane.


Może to pomóc w uzyskaniu wizualnego przykładu i może sprawić, że sprawy staną się bardziej przejrzyste. jQuery działa jak klasa. Warto więc skorzystać z bardzo prosty przykład gdzie przez wzgląd na przykład za funkcja $() nie istnieje:

class jQuery { 
    constructor(element) { 
     this.element = element; 
    } 
} 

var obj1 = new jQuery(this); 
var obj2 = new jQuery(this); 

console.log(obj1 === obj2); // false 

Oba te używają dokładnie tego samego argumentu (this), aby utworzyć nową „jQuery” obiekt. Ale po raz kolejny obj1 jest zupełnie inną instancją niż obj2. Obaj mają swoje wyjątkowe miejsce w pamięci.

+3

+1 - Ponadto, jeśli chcesz porównać wartości, użyj 'this === this'. Aby wyjaśnić, po zawinięciu go '$()' zwracana jest instancja obiektu [jQuery] (https://learn.jquery.com/using-jquery-core/jquery-object/) (możesz chcieć wyjaśnić to w twojej odpowiedzi). –

+0

Oznaczono jako odpowiedź, ponieważ odnosi się do źródła pytania, które zasadniczo jest "co zwraca (lub ...) (lub robi) pod kontrolą?". – NicholasFolk

+1

@NicholasFolk, niesamowite. Poszedłem również dalej i dodałem bardziej widoczny przykład tego, jak to działa z uwagi na komentarz JoshCroziera. – KevBot