前言
我是一个应届找不到工作的小小菜鸟,为了学习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
等。
复杂数据类型都会存储在
堆内存
中,简单数据类型则是存储在栈内存
里。我们在定义一个复杂数据类型的时候,会先在堆内存
中开辟空间,把数据存进去后,再把内存地址
返回给我们所定义的变量。这样看来,我们所进行的对比操作,原来不是值的对比,而是内存地址
的对比。
图片来自网络
所以对象名其实指向的是对象的内存地址,所以创建对象都会新开辟新空间,与之对应的也会产生新内存地址,所以即使两个对象的属性与属性值都一模一样,地址也是不同的。其他复杂数据类型也是同样的原理。