解决方案 »

  1.   

    a = ["a",{c:1},["c"]];
    a.indexOf("a");
    a.indexOf({c:1});
    a.indexOf(["c"]);
      

  2.   

    morePeople是数组啊,包含person所以可以找到 
      

  3.   

    你觉得people[0]和person是一样么?
    person是个引用类型,如果是值类型people.indexOf(person)则为0。
      

  4.   

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

  5.   


    刚刚看了4楼的回答,突然间明白了。你这样说也不对,morePeople是数组,可是people也是数组啊?
    原因在于people数组里面保存的是person引用的值(是值,也就是对象本身,但是javascript里面不叫对象,就叫引用的值);而morePeople里面保存的是引用,不是引用的值。因此,在两个数组里搜索person的引用,当然就只能在moremorePeople里面找到了。不知道我这个理解对不对?
      

  6.   

    对刚刚讲的再纠正一下,morePeople和people都是引用,我应该说他们的引用所指向的堆内存地址
      

  7.   

    indexOf返回-1表示未找到 返回0者是第一位
      

  8.   

    数组的.indexOf方法,对于引用型的对象,是按对象的引用比较的morePeople[0]与person是同一个对象的引用people[0]与person是两个不同的对象,虽然对象的内容一样,
      

  9.   

    谢谢!你的回答对我启发很大!但是方向好像也有点偏差了。
    我的这句话是不对的。 people[0]和person 是 ==的关系,  == 如果两边操作数都是对象的话,比较他们是不是同一个对象。 但是indexOf()中实现的确实是全等操作符 === 。 所以数组people中的第一个元素和person指向的不是同一个对象, ==也不成立,=== 更不成立了。 所以 -1了。 
      

  10.   

    你要明白 这样查找的时候 比对的是对象的引用 你上面people在查找person的时候 两个对象的引用时不一样的 所以查不到
      

  11.   

    people里面的那个对象不是person,而是另外新建的一个对象,他不等于person,所以indexOf返回 -1,
    你要理解了对象的引用就好理解