浅克隆:
引用值改变, 两个都一起变。
改变克隆对象
改变temp.hobby[0] , obj.hobbyj[0]随之改变。
因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.hobby和 temp.hobby指向同一块内存地址。
深克隆:
1)判断是不是引用值
1.1)判断是数组还是对象。
2)建立相应的数组或对象。
3)递归。
改变克隆对象
而深克隆则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。
这就不会存在上面 obj.hobby和 temp.hobby属性指向同一个对象的问题。
简单来说,对于字符串类型,浅克隆是对值的复制,对于对象来说,浅克隆是对对象地址的复制,并没 有开辟新的栈,也就是克隆的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深克隆则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。