当你写{a: 'a', b: 'b'}
,要创建在JavaScript中一个新的对象。当您再次编写它时,您会创建另一个对象,但两个对象都包含相同的值。当您将它归因于变量时,变量仅包含每个对象的引用(“指针”)。当你写
var test = {a: 'a', b: 'b'};
var test2 = {a: 'a', b: 'b'};
你有两个变量指向两个对象:
当你比较两个变量,你只是比较指针。由于两个对象不同,所以指针是不同的,并且比较的结果是false
。 OTOH,如果你做下面
var test = {a: 'a', b: 'b'};
var test2 = test;
代码的结果是test
和test2
指向同一个对象,都是平等的。
(更多关于引用on Wikipedia,这将是很好的了解pointers太)。
你想要做的是在$.inArray()
函数中使用深度比较。如果您的目标只是比较值,我会建议您使用Underscore.js isEqual()
function。既然是不是这样的,和$.inArray()
不接受一个比较器作为参数,我敢打赌,你必须手动实现它:
function inArray(element, array) {
for (var key in array) {
if (_.isEqual(element, array[key])) {
return true;
}
}
return false;
}
编辑:好,如果我们的功能没有收到这将是真棒比较器作为参数!
function inArray(element, array, cmp) {
if (typeof cmp != "function") {
cmp = function (o1, o2) {
return o1 == o2;
};
}
for (var key in array) {
if (cmp(element, array[key])) {
return true;
}
}
return false;
}
测试中的Node.js:
> inArray(test2, a)
false
> inArray(test2, a, function(o1, o2){return o1 === o2;})
false
> inArray(test2, a, _.isEqual)
true
当然,这带来了更多的复杂性为您的特定问题,所以你不需要使用它。不过,我认为这可能是有效的注册这个想法:)
看看这个问题:http://stackoverflow.com/questions/1068834/object-comparison-in-javascript – Joe