Answers:
从jQuery 1.6开始,您可以使用.is
。以下是一年多以前的答案...
var a = $('#foo');
var b = a;
if (a.is(b)) {
// the same object!
}
如果要查看两个变量是否实际上是同一对象,例如:
var a = $('#foo');
var b = a;
...然后您可以检查其唯一ID。每次创建新的jQuery对象时,它都会获得一个ID。
if ($.data(a) == $.data(b)) {
// the same object!
}
虽然,可以通过simple实现相同的效果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>
所以实际上您应该在实际程序中比较jQuery对象的ID元素,例如
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
比较合适。
首先使用此功能基于密钥订购对象
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 = {key:val};
var b = {key:val};
JSON.stringify(a)== JSON.stringify(b) ----->如果内容相同,则为 true。
A.selector === B.selector && A.context === B.context
。通常上下文总是相同的,因此我们只需要考虑选择器。