Od wersji jQuery 1.6 możesz używać .is
. Poniżej odpowiedź sprzed ponad roku ...
var a = $('#foo');
var b = a;
if (a.is(b)) {
// the same object!
}
Jeśli chcesz sprawdzić, czy dwie zmienne są w rzeczywistości tym samym obiektem, np:
var a = $('#foo');
var b = a;
... wtedy możesz sprawdzić ich unikalne identyfikatory. Za każdym razem, gdy tworzysz nowy obiekt jQuery, otrzymuje on identyfikator.
if ($.data(a) == $.data(b)) {
// the same object!
}
Chociaż to samo można osiągnąć za pomocą prostego a === b
, powyższe może przynajmniej pokazać następnemu programistowi dokładnie, do czego testujesz.
W każdym razie prawdopodobnie nie o to ci chodzi. Jeśli chcesz sprawdzić, czy dwa różne obiekty jQuery zawierają ten sam zestaw elementów, możesz użyć tego:
$.fn.equals = function(compareTo) {
if (!compareTo || this.length != compareTo.length) {
return false;
}
for (var i = 0; i < this.length; ++i) {
if (this[i] !== compareTo[i]) {
return false;
}
}
return true;
};
Źródło
var a = $('p');
var b = $('p');
if (a.equals(b)) {
// same set
}
A.selector === B.selector && A.context === B.context
. Często kontekst będzie zawsze ten sam, więc musimy tylko wziąć pod uwagę selektor.$(':first')
i$('*:first')
equals
funkcja wydaje się być wrażliwa na kolejność. coś takiego jak stackoverflow.com/a/29648479 działałoby w większej liczbie przypadków, chociaż jest wolniejsze.Jeśli nadal nie wiesz, możesz odzyskać oryginalny obiekt poprzez:
ponieważ
$("#deviceTypeRoot")
również zwraca tablicę obiektów, które wybrał selektor.źródło
true
, ponieważ porównujesz odniesienie do elementu DOM,==
a===
dadzą Ci te same wyniki (nie jest wymagane wymuszanie typu, są to tylko dwa odwołania do obiektów)$.fn.equals(...)
Rozwiązaniem jest prawdopodobnie najczystszym i najbardziej elegancki jeden.Próbowałem czegoś tak szybkiego i brudnego:
Prawdopodobnie jest drogie, ale wygodną rzeczą jest to, że jest niejawnie rekurencyjna, podczas gdy eleganckie rozwiązanie nie.
Tylko moje 2 centy.
źródło
{a: 1, b: 2}
i{b: 2, a: 1}
to wróci,false
gdy powinno wrócićtrue
.Ogólnie rzecz biorąc, złym pomysłem jest porównywanie $ (foo) z $ (foo), ponieważ jest to równoważne funkcjonalnie następującemu porównaniu:
Oczywiście nigdy nie spodziewałbyś się "spieprzenia silnika JS". Używam „$” tylko po to, aby wyjaśnić, co robi jQuery.
Za każdym razem, gdy wywołujesz $ ("# foo"), faktycznie wykonujesz jQuery ("# foo"), które zwraca nowy obiekt . Zatem porównywanie ich i oczekiwanie tego samego przedmiotu nie jest poprawne.
Jednak MOŻESZ zrobić coś takiego:
Więc naprawdę powinieneś porównać elementy ID obiektów jQuery w swoim prawdziwym programie, więc coś w stylu
jest bardziej odpowiednie.
źródło
Użyj metody Underscore.js isEqual http://underscorejs.org/#isEqual
źródło
Najpierw zamów obiekt na podstawie klucza, używając tej funkcji
Następnie porównaj zmienną wersję swojego obiektu, używając tej funkcji
Zakładając, że klucze obiektów są uporządkowane w różny sposób i mają te same wartości
źródło
Jeśli chcesz sprawdzić, czy zawartość jest równa, czy nie, po prostu użyj JSON.stringify (obj)
Np. - var a = {klucz: val};
var b = {klucz: wart};
JSON.stringify (a) == JSON.stringify (b) -----> Jeśli zawartość jest taka sama, otrzymasz wartość true.
źródło