我在Javascript上遇到问题。
var reponseValide1 = [{
title: "test"
}, {
text: "test"
}];
var reponseValide2 = [{
title: "test"
}];
console.log(reponseValide1.indexOf(reponseValide2[0]));
以上代码记录了false
。我不明白为什么。 reponseValide2
确实包含具有相同变量和类型的相同对象。你能帮我理解为什么吗?
答案 0 :(得分:0)
在幕后,Array.prototype.indexOf()
基本上是在每个元素上执行strict equality check,并返回第一个肯定结果的索引。
在JavaScript中,objects等于determined on the basis of whether they share the same reference。
仅当操作数引用相同的对象时,比较对象的表达式才为真。
要根据内容比较对象,需要一个更复杂的解决方案-最简单的方法通常是将每个对象包装在JSON.stringify()
中(尽管效率很低)。 More efficient solutions倾向于将各个键和值进行比较。
请参见下面的粗略演示。
const A = {x: 'y'}
const B = {x: 'y'}
const AB = [A, B]
console.log(AB.indexOf(A)) // => 0
console.log(AB.indexOf(B)) // => 1
console.log(A === B) // => false
console.log(A === A) // => true
console.log(JSON.stringify(A) === JSON.stringify(B)) // => true
答案 1 :(得分:0)
这是因为这些对象没有引用相同的对象。您也可以使用此代码获取匹配的索引。
CLLocationManager
答案 2 :(得分:0)
“ reponseValide2”确实包含相同的对象,具有相同的变量和类型
不,不是! 可能看起来像,但是那两个是不同的对象。对象相等意味着检查它们是否是相同的实例(即它们指向内存中的相同地址)。
以下面的代码为例:
a = {x: 1}
b = {x: 1}
console.log(a == b)
> false
在创建时,将在内存中创建{x: 1}
对象,并将其地址分配给a
。创建第二个对象时,它将被放置在不同的存储区域中,并且b
将包含与a
不同的地址。
如果a
和b
是同一个对象,那么修改a
也将意味着修改b
!例如:
a = {x: 1}
b = a
a.x = 2
console.log(b.x)
> 2
如果您确实想在两个数组中都具有相同的对象,则必须先创建它,然后将其添加到两个数组中,如下所示:
var myObj = {
title: "test"
};
var reponseValide1 = [
myObj,
{text: "test"}
];
var reponseValide2 = [myObj];
console.log(reponseValide1.indexOf(reponseValide2[0]));
但是,如果您不想拥有相同的对象,但是想要检查它们是否相等,则必须手动进行操作,例如检查text
属性,如下所示:
var reponseValide1 = [{
title: "test"
}, {
text: "test"
}];
enter code here
var reponseValide2 = [{
title: "test"
}];
for (var i = 0; i < responseValide1.length; i++) {
if (responseValide1[i].title == responseValide2[0].title) {
console.log(i);
break;
}
}