varperson={name:"Nike"};varpeople=[{name:"Nike"}];varmorepeople=[person];console.log(people.indexOf(person));//打印-1console.log(morepeople.indexOf(person));//打印0想问下,为什么第四行和第五行会有这个差别?
2 回答
PIPIONE
TA贡献1829条经验 获得超9个赞
对象存储的一些概念。当我们创建一个对象的时候varobj={};obj叫做对象的引用,存储的是对象的内存地址,这个地址指向实际的存储{}的单元。所以,当我们再创建一个对象varobj_1={};这个时候,obj和obj_1分别存储的是前一个{}和后一个{}的地址,这两个地址显然是不一样的。所以obj和obj_1不相等。与对象相对应的是基本数据类型,比如intvari1=1,i2=1;这里i1和i2不仅看起来相同,而且确实是相等的。这是因为,创建基本类型的变量的时候,js会对值相同的分配同一块内存,它们的地址相同,所以可以相等。但是,如果通过下面的方式创建的i1和i2,就不相等了vari1=newNumber(1),i2=newNumber(1);indexOf这里的数组对象的indexOf会对传入的参数和数组元素逐个匹配,遇到相同的就返回。因为上面的obj和obj_1并不相等,所以[obj].indexOf(obj_1)的结果是-1
慕斯709654
TA贡献1840条经验 获得超5个赞
indexOf和lastIndexOf在内部使用===运算符来判定相等性,对于对象来说,只有当两个对象引用同一内存地址时,它们才被认为是相等的。JS引擎每遇到一个对象字面量,都会分配一个新的内存地址vara={}varb={}a===b//false
添加回答
举报
0/150
提交
取消