日期:2014-05-16  浏览次数:20372 次

关于javascript中indexOf方法的一个疑问
刚刚在看javascript高级程序设计(第3版)的时候,看到介绍indexOf方法,前面都懂,可是后面他写出的一个例子中,我却蒙住了,下面是例子

var person = { name: "Nicholas" };
var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person)); //0

请问为什么第一个输出的是-1,第二个输出的是0.people和morePeople不都是一样的吗?
------解决方案--------------------
你觉得people[0]和person是一样么?
person是个引用类型,如果是值类型people.indexOf(person)则为0。
------解决方案--------------------
楼主,我也刚刚看完JS高级程序设计,在看JS精粹
首先,你要确认基本类型和引用类型 的区别。 不知道你看到了没。 
基本类型的变两个保存的是值,引用类型变量保存的是引用。 
回到问题。 
{ name: "Nicholas" }; //是一个对象, person保存的是指向该对象的引用。 
[{ name: "Nicholas" }]; //是一个数组(引用类型) people保存的也是指向该数组的引用
morePeople = [person]; // 是一个数组,morePeople保存的是指向该数组的引用。 
people和morePeople指向的完全不是同一个东西。 
people.indexOf(person) //  我明白你的迷茫在哪里 
明明都一样嘛 为啥为-1嘞,  这就要看indexOf的实现方法了,  
people[0]和person 是 ==的关系, 而不是===的关系。 indexOf 内部采用的是 ===。 
我也是全凭记忆啊,书上也有这么说好像。  
回头我再查查。 
------解决方案--------------------
数组的.indexOf方法,对于引用型的对象,是按对象的引用比较的

morePeople[0]与person是同一个对象的引用

people[0]与person是两个不同的对象,虽然对象的内容一样,

------解决方案--------------------
你要明白 这样查找的时候 比对的是对象的引用 你上面people在查找person的时候 两个对象的引用时不一样的 所以查不到
------解决方案--------------------
people里面的那个对象不是person,而是另外新建的一个对象,他不等于person,所以indexOf返回 -1,
你要理解了对象的引用就好理解