javascript - Js位置方法,关于indexOf()
阿神
阿神 2017-04-10 16:01:39
[JavaScript讨论组]
    var person = {name:"Nike"};
    var people = [{name:"Nike"}];
    var morepeople = [person];
    console.log(people.indexOf(person));  //打印-1
    console.log(morepeople.indexOf(person)); //打印0

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

阿神
阿神

闭关修行中......

全部回复(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
PHP中文网

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

person === people[0] // false

好好理解一下对象。:)

PHP中文网

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

阿神

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

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

值类型和引用类型的区别

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号