我在javascript中有一个对象数组,类似于
var arrayobj = [{a:'a'},{b:'b'},{c:'c'}]
(但值更复杂)。
现在我手动检查某个对象的索引,例如arrayobj[1]
我得到了Object {b: "b"}
现在我输入arrayobj.indexOf({b:'b'});
响应是-1
(又名未找到)。
任何人都可以告诉我为什么会这样?我已经阅读了有关indexOf方法和数组的文档,但我仍然没有任何线索。
提前致谢!
答案 0 :(得分:3)
indexOf
检查是否相等(特别是严格的相等,===
,但对于这个问题并不重要)。两个不同的对象即使具有相同的属性也彼此不相等。数组中的对象和传递给indexOf
的对象是不同的对象,因此它们不匹配。
如果您搜索了相同的对象,它会找到它:
var b = {b:'b'};
var arrayobj = [{a:'a'},b,{c:'c'}];
console.log(arrayobj.indexOf(b)); // 1

答案 1 :(得分:1)
indexOf方法返回可在数组中找到给定元素的第一个索引,如果不存在则返回-1。
arrayobj
是一个对象数组,在第一种情况下arrayobj[1]
它将返回索引为1的元素。
在第二种情况下,arrayobj.indexOf({b:'b'})
不是指arrayobj
中的对象,而是指另一个对象。
答案 2 :(得分:1)
arrayobj.indexOf({b:'b'})
虽然内容相同,但您在indexOf方法中提供了一个新对象。 IndexOf将检查严格的相等性,因此对象的引用需要相同
答案 3 :(得分:1)
当您致电arrayobj.indexOf({b:'b'})
时,对象{b:'b'}
与数组中的对象不同。这2个对象具有相同的"值"但在记忆中是不同的。
例如,如果你这样做:
var object = {b:'b'}
var arrayobj = [{a:'a'},object,{c:'c'}]
或
var arrayobj = [{a:'a'},{b:'b'},{c:'c'}]
var object = arrayobj[1]
arrayobj.indexOf(object)
将返回1,因为它实际上是同一个对象,而不是"副本"
答案 4 :(得分:-2)
Javascript IndexOf函数仅适用于值类型,而不适用于您的案例中的引用类型。就像你将{b:'b'}传递给indexOf函数一样,它就是一个完全不同的对象/引用。如果你首先从列表中获取对象,然后在列表中检查该引用,那么如果存在对象/引用,它肯定会返回大于-1的
ignoreElements()
你可以使用for循环而不是内置函数。