两个有相同属性和值的对象为什么不相等

前言

我是一个应届找不到工作的小小菜鸟,为了学习js,通过这种方式来强迫自已学习。另一方面则是分享自已学习的心得,如果有不对的地方,希望能得到大佬们的批评指正。

正文

在写js的时候,我们会遇到对象和数组,即使它们有属性和值,它们也不相等。同样,两个不同的数组,即使每个元素都相同,顺序也相同,他们也不想等

let a = {x: 1}, b = {x: 1}
a === b                    // => false 不同的对象永远也不会相等
let o = [], p = []         // =>
o === p                    // => false 不同的数组永远也不会相等

书上说到的是:“对象有时候被称作引用类型(referencetype),以区别于JavaScript的原始类型。基于这一术语,对象值就是引用,对象是按引用比较的。换句话说,两个对象值当且仅当它们引用同一个底层对象时,才是相等的。”

let a =[]; //这个变量引用一个空数组
let b = a; //现在b引用了同一个数组
b[0]= 1;   //修改变量b引用的数组
a[0]       //=>1:变化也能通过变量a看到
a === b    //=>true:a和b引用同一个对象,所以它们相等


从上面的代码可以看出,把对象(或数组)赋值给一个变量,其实是在赋值引用,并不会创建对象的新副本。如果想创建对象或数组的新副本,必须显式复制对象的属性或数组的元素。

看完还是有点迷惑,自已查阅到一个比较好理解的解释

js的数据类型分为简单数据类型和复杂数据类型。简单数据类型包括:Number、String、Boolean、 undifined、Null等,复杂数据类型包括:Object、Array、function等。

复杂数据类型都会存储在堆内存中,简单数据类型则是存储在栈内存里。我们在定义一个复杂数据类型的时候,会先在堆内存中开辟空间,把数据存进去后,再把内存地址返回给我们所定义的变量。这样看来,我们所进行的对比操作,原来不是值的对比,而是内存地址的对比。 

图片来自网络 

所以对象名其实指向的是对象的内存地址,所以创建对象都会新开辟新空间,与之对应的也会产生新内存地址,所以即使两个对象的属性与属性值都一模一样,地址也是不同的。其他复杂数据类型也是同样的原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值