javascript - js对象的相等和等同问题
巴扎黑
巴扎黑 2017-04-11 12:48:20
[JavaScript讨论组]

请问为什么test1和3输出是false?

巴扎黑
巴扎黑

全部回复(8)
天蓬老师

js中{}[]指向的是内存中的一个地址,

{} === {} //false

[] === [] //false

{}[]进行比较的时候=判断的是地址是否相等,而不是内容

阿神

对象存储在堆,指向该对象的指针(地址)存储在栈里,创建这两个对象时,都会存储在堆里,但是存储的位置不同,其对应的地址也是不同的,所以你用"=="和"===",肯定都是false。

高洛峰

引用类型的数据比较的是地址,基本类型的数据比较的才是内容

伊谢尔伦

对象存储在堆里,每个指针对应一个存储位置,他们虽然长得很像,但是指针对应的地址不同,所以不能用"=="更不能"===";顺便提一下,js没有指针的概念,可以借助C中的指针理解

迷茫

因为他们地址不同。

test1 = {};
test2 = {};
test3 = test2;

其中test1是一个对象,test2和test3是另一个对象。
他们只是内容相同,不能说明他们是同一个对象。

阿神

var myData1 = {name:"Adam",weather:"sunny"}
相当于

var myData1 = new Object();myData1.name = "Adam";myData1.weather = "sunny";

其实就是一个对象的实例,每个实例都指向一块新的内存地址

怪我咯

关键字说明:

原始值 (primitives):undefined null boolean number string
对象值 (objects):除了原始值外,其他的所有值都是对象类型的值,包括数组 (array) 和函数 (function) 等。
==: 用于一般比较,比较的时候可以进行转换数据类型。
===` :用于严格比较,只要类型不匹配就返回false。

myData1 == myData2

因为 == 左边和右边都为对象值,比较的是两个引用值在内存中是否是同一个对象,虽然myData1 与 myData2值相同,但确是两个互不相关的对象,自然 ==false

myData1 === myData2

其实 == 都返回了false,对于 === 自然也是false,判断依据同是两个值引用的不是同一个对象

小结:

  1. 判断两个对象值是否相同就是看引用地址是否相同。

  2. ===== 的区别在处理原始值的时候是有区别的,而对于两边都是对象值时就相同了。
    参考地址:[1]

参考资料:[2]

怪我咯

相等操作符(==)会强行转换类型。
1.如果一边是对象,另一边不是,那么会按照调用valueOf、toString方法返回基本类型数值,如果没有,则为NaN
2.如果两边都是对象,那么就看引用的对象是否相同。
显然这两个对象只是数值一样,但是指针是不同的,所以用(==)判断是false

而(===)全等操作符不会转换类型,是一种严格比较,既然引用的指针都不同,那么(===)肯定就是false

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

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