Відповіді:
Оскільки jQuery 1.6, ви можете використовувати .is
. Нижче наводиться відповідь понад рік тому ...
var a = $('#foo');
var b = a;
if (a.is(b)) {
// the same object!
}
Якщо ви хочете побачити, чи дві змінні насправді є одним і тим же об'єктом, наприклад:
var a = $('#foo');
var b = a;
... тоді ви можете перевірити їх унікальні ідентифікатори. Кожен раз, коли ви створюєте новий об'єкт jQuery, він отримує ідентифікатор.
if ($.data(a) == $.data(b)) {
// the same object!
}
Хоча те саме можна досягти і з простим a === b
, вищесказане може принаймні показати наступному розробникові саме те, для чого ви тестуєте.
У будь-якому випадку, це, мабуть, не те, що ви хочете. Якщо ви хочете перевірити, чи містять два різні об’єкти jQuery однаковий набір елементів, ви можете використовувати це:
$.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')
і$('*:first')
equals
здається, ваша функція залежить від порядку. щось на зразок stackoverflow.com/a/29648479 працювало б у більшості випадків, хоча це повільніше.
Якщо ви все ще не знаєте, ви можете повернути оригінальний об'єкт за допомогою:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
тому що $("#deviceTypeRoot")
також повертає масив об'єктів, який вибрав селектор.
true
, оскільки ви порівнюєте посилання елемента DOM, ==
vs ===
ви отримаєте однакові результати (не потрібно примусовий тип, вони є лише двома посиланнями на об'єкти)
$.fn.equals(...)
Рішення, ймовірно , найчистіший і найелегантніший один.
Я спробував щось швидке і брудне, як це:
JSON.stringify(a) == JSON.stringify(b)
Це, мабуть, дорого, але зручно в тому, що він неявно рекурсивний, тоді як елегантне рішення - ні.
Всього мої 2 копійки.
{a: 1, b: 2}
і {b: 2, a: 1}
це повернеться, false
коли воно має повернутися true
.
Загалом, погана ідея порівнювати $ (foo) з $ (foo), оскільки це функціонально еквівалентно наступному порівнянню:
<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>
Звичайно, ви ніколи не очікували "накручування двигуна JS". Я використовую "$" лише для того, щоб зрозуміти, що робить jQuery.
Щоразу, коли ви телефонуєте $ ("# foo"), ви насправді робите jQuery ("# foo"), який повертає новий об'єкт . Тому порівнювати їх та очікувати одного і того ж об’єкта - не правильно.
Однак, що ви МОЖЕТЕ зробити, це щось на зразок:
<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>
Тому дійсно вам, можливо, слід порівняти елементи ID об’єктів jQuery у вашій реальній програмі на зразок чогось подібного
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
є більш доречним.
Використовуйте метод Underscore.js isEqual http://underscorejs.org/#isEqual
Спочатку замовляйте об’єкт на основі ключа за допомогою цієї функції
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
Потім порівняйте пошагову версію вашого об'єкта, використовуючи цю функцію
function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Ось приклад
Припустимо, що ключі об’єктів упорядковані по-різному і мають однакові значення
var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}
isEqualObject(obj1,obj2);//returns true
Якщо ви хочете перевірити, що вміст є рівним чи ні, просто використовуйте JSON.stringify (obj)
Напр. - var a = {ключ: val};
var b = {ключ: val};
JSON.stringify (a) == JSON.stringify (b) -----> Якщо вміст однаковий, ви станете справжнім.
A.selector === B.selector && A.context === B.context
. Часто контекст завжди буде однаковим, тому нам залишається лише враховувати селектор.