Respostas:
Desde o jQuery 1.6, você pode usar .is
. Abaixo está a resposta de mais de um ano atrás ...
var a = $('#foo');
var b = a;
if (a.is(b)) {
// the same object!
}
Se você deseja ver se duas variáveis são realmente o mesmo objeto, por exemplo:
var a = $('#foo');
var b = a;
... então você pode verificar seus IDs exclusivos. Toda vez que você cria um novo objeto jQuery, ele recebe um ID.
if ($.data(a) == $.data(b)) {
// the same object!
}
Embora, o mesmo possa ser alcançado com um simples a === b
, o acima pode pelo menos mostrar ao próximo desenvolvedor exatamente o que você está testando.
De qualquer forma, provavelmente não é isso que você procura. Se você quiser verificar se dois objetos jQuery diferentes contêm o mesmo conjunto de elementos, você pode usar isso:
$.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')
e$('*:first')
equals
função parece ser sensível à ordem. algo como stackoverflow.com/a/29648479 funcionaria em mais casos, embora seja mais lento.
Se você ainda não sabe, pode recuperar o objeto original:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
porque $("#deviceTypeRoot")
também retorna uma matriz de objetos que o seletor selecionou.
true
, porque você está comparando a referência do elemento DOM, ==
vs ===
lhe dará os mesmos resultados (nenhum tipo de coerção necessários, eles são apenas duas referências de objeto)
A $.fn.equals(...)
solução é provavelmente a mais limpa e elegante.
Eu tentei algo rápido e sujo como este:
JSON.stringify(a) == JSON.stringify(b)
Provavelmente é caro, mas o mais confortável é que é implicitamente recursivo, enquanto a solução elegante não é.
Apenas meus 2 centavos.
{a: 1, b: 2}
e {b: 2, a: 1}
isso retornará false
quando deve retornar true
.
Geralmente, é uma má idéia comparar $ (foo) com $ (foo), pois isso é funcionalmente equivalente à seguinte comparação:
<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>
É claro que você nunca esperaria "erro no motor JS". Eu uso "$" apenas para deixar claro o que o jQuery está fazendo.
Sempre que você chama $ ("# foo"), está realmente fazendo um jQuery ("# foo") que retorna um novo objeto . Portanto, compará-los e esperar o mesmo objeto não está correto.
No entanto, o que você pode fazer é algo como:
<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>
Então, na verdade, você talvez deva comparar os elementos de identificação dos objetos jQuery no seu programa real, para algo como
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
é mais apropriado.
Use o método isEqual de Underscore.js http://underscorejs.org/#isEqual
Primeiro ordene seu objeto com base na chave usando esta função
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
Em seguida, compare a versão rigorosa do seu objeto, usando esta função
function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Aqui está um exemplo
Supondo que as chaves dos objetos sejam ordenadas de forma diferente e tenham os mesmos valores
var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}
isEqualObject(obj1,obj2);//returns true
Se você deseja verificar se o conteúdo é igual ou não, basta usar JSON.stringify (obj)
Por exemplo - var a = {chave: val};
var b = {chave: val};
JSON.stringify (a) == JSON.stringify (b) -----> Se o conteúdo for o mesmo, você será verdadeiro.
A.selector === B.selector && A.context === B.context
. Muitas vezes, o contexto sempre será o mesmo, portanto, precisamos considerar apenas o seletor.