Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在具有indexOf的数组中找不到该对象_Javascript - Fatal编程技术网

Javascript 为什么在具有indexOf的数组中找不到该对象

Javascript 为什么在具有indexOf的数组中找不到该对象,javascript,Javascript,当我搜索下面的对象文字时,我得到了索引-1,但我不明白为什么 我可以不使用复杂类型(如object literal)在数组中搜索此对象吗 var fruits = [{name: "Banana"}, {name: "Orange"}]; var index = fruits.indexOf({name: "Banana"}); -1表示数组中未找到{name:“Banana”}。这是因为第一个{name:“Banana”}与第二个{name:“Banana”}是不同的对象 如果您正在搜索一个

当我搜索下面的对象文字时,我得到了索引-1,但我不明白为什么

我可以不使用复杂类型(如object literal)在数组中搜索此对象吗

var fruits = [{name: "Banana"}, {name: "Orange"}];
var index = fruits.indexOf({name: "Banana"});

-1
表示数组中未找到
{name:“Banana”}
。这是因为第一个
{name:“Banana”}
与第二个
{name:“Banana”}
是不同的对象

如果您正在搜索一个基元类型,它将按照您期望的方式工作。然而,对于一个对象,它会看到实际对象是相同的东西(即内存中的相同位置),而不仅仅是它们具有相同的值

因此:

foo
是与
bar
不同的对象。它们恰好具有相同的属性。但它们在内存中占据不同的位置。或者,换句话说,如果我修改
foo
bar
保持不变


很多库已经为您解决了“deep equals”问题,所以如果您使用jQuery或下划线或其他东西,请检查这里。否则,请查看如何实现,因为存在一些问题。

对于多维数组,我不相信您可以以如此简单的方式使用indexOf,但是,您可以使用以下内容:

for(var i = 0; i < fruits.length; i++) {
   if(fruits[i].name === 'Banana') {
     return i;
   }
}
for(var i=0;i
对象不能以任何简单的方式进行比较,这里有一个相关的帖子:在简短的回答中对实际问题有帮助的解决方案:因为
{name:“Banana”}==={name:“Banana”}
是错误的。正如其他评论和回答中所暗示的,使用
==
,因此,对象成员只有在引用同一个对象时才会相等。@RobG:如果使用松散比较,则不会有什么区别。两个对象总是通过引用进行比较。哪个下划线命令可以实现您所描述的功能?@dandavis
isEqual()
for(var i = 0; i < fruits.length; i++) {
   if(fruits[i].name === 'Banana') {
     return i;
   }
}