Odpowiedzi:
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;
};
var a = $('p');
var b = $('p');
if (a.equals(b)) {
// same set
}
$(':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:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
ponieważ $("#deviceTypeRoot")
również zwraca tablicę obiektów, które wybrał selektor.
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:
JSON.stringify(a) == JSON.stringify(b)
Prawdopodobnie jest drogie, ale wygodną rzeczą jest to, że jest niejawnie rekurencyjna, podczas gdy eleganckie rozwiązanie nie.
Tylko moje 2 centy.
{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:
<html>
<head>
<script language='javascript'>
function foo(bar) {
return ({ "object": bar });
}
$ = foo;
if ( $("a") == $("a") ) {
alert ("JS engine screw-up");
}
else {
alert ("Expected result");
}
</script>
</head>
</html>
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:
<html>
<head>
<script language='javascript'>
function foo(bar) {
return ({ "object": bar });
}
$ = foo;
if ( $("a").object == $("a").object ) {
alert ("Yep! Now it works");
}
else {
alert ("This should not happen");
}
</script>
</head>
</html>
Więc naprawdę powinieneś porównać elementy ID obiektów jQuery w swoim prawdziwym programie, więc coś w stylu
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
jest bardziej odpowiednie.
Użyj metody Underscore.js isEqual http://underscorejs.org/#isEqual
Najpierw zamów obiekt na podstawie klucza, używając tej funkcji
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
Następnie porównaj zmienną wersję swojego obiektu, używając tej funkcji
function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Oto przykład
Zakładając, że klucze obiektów są uporządkowane w różny sposób i mają te same wartości
var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}
isEqualObject(obj1,obj2);//returns true
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.
A.selector === B.selector && A.context === B.context
. Często kontekst będzie zawsze ten sam, więc musimy tylko wziąć pod uwagę selektor.