Js位置方法,关于indexOf()

    var person = {name:"Nike"};
    var people = [{name:"Nike"}];
    var morepeople = [person];
    console.log(people.indexOf(person));  //打印-1
    console.log(morepeople.indexOf(person)); //打印0

想问下,为什么第四行和第五行会有这个差别?

阅读 4.4k
6 个回答
  1. 对象存储的一些概念。
    当我们创建一个对象的时候

var obj = {};

obj叫做对象的引用,存储的是对象的内存地址,这个地址指向实际的存储 {} 的单元。
所以,当我们再创建一个对象

var obj_1 = {};

这个时候,obj 和 obj_1 分别存储的是前一个{}和后一个{}的地址,这两个地址显然是不一样的。
所以 obj 和 obj_1 不相等。

与对象相对应的是基本数据类型,比如 int

var i1 = 1, i2 = 1;

这里 i1 和 i2 不仅看起来相同,而且确实是相等的。这是因为,创建基本类型的变量的时候,js会对值相同的分配同一块内存,它们的地址相同,所以可以相等。但是,如果通过下面的方式创建的 i1 和 i2,就不相等了

var i1 = new Number(1), i2 = new Number(1);
  1. indexOf
    这里的数组对象的indexOf会对传入的参数和数组元素逐个匹配,遇到相同的就返回。
    因为上面的 obj 和 obj_1 并不相等,所以

[obj].indexOf(obj_1)

的结果是 -1

  1. indexOf 和 lastIndexOf 在内部使用 === 运算符来判定相等性,对于对象来说,只有当两个对象引用同一内存地址时,它们才被认为是相等的。

  2. JS 引擎每遇到一个对象字面量,都会分配一个新的内存地址

var a = {}
var b = {}
a === b // false

因为 person 和 people[0] 并不是同一个实例。这么看就明白了。

person === people[0] // false

好好理解一下对象。:)

person又不在people中,怎么可能打印出位置
person -> {name:"Nike"}people[0] -> {name:"Nike"} 是两个不同对象

就是值类型和引用类型的区别呗

{} === {} // false
var person = {name:"Nike"}; 
var people = [{name:"Nike"}]; //这里创建了一个新对象

值类型和引用类型的区别

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题