js对象的相等和等同问题

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

图片描述

阅读 5.8k
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

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