两个对象的直接赋值是浅复制,只是将被赋值对象(listB)指向了赋值对象(listA)的地址 ,所以两者的值都是一样的
let listA = {a: 1}
let listB = listA
如果像以下代码,listA对象的属性指向了listA对象所存储的地址,那么就会出线无限的“嵌套“,由于两个对象指向的地址依旧没有变化,所以两者还是一致的
let listA = {next: {}}
let listB = listA
listA.next = listA
!!!坑来了
如以下代码,listA和listB还能一致吗
let listA = {a: 0, next: {}}
let listB = listA
let i = 0
while(i++ < 3) {
listA.next = {a:i, next: {}}
listA = listA.next
}
循环前,两者依旧指向一个地址
循环开始,listA的属性指向了另一个存储地址,此时listB也同样有该操作
但是listA = listA.next,直接将listA指向了它属性所指向存储地址,改变了原有的指向,但是listB没有变
所以第一步的结果是:
listA: {a:1, next :{}}
listB:{a:0,next{a:1,next{}}}
后面两次的循环也是如此,即listA的指向改变,覆盖了原先的值