这里只研究对象,不专门研究别数据类型
浅拷贝:
两个变量之间赋值,它们存着相同的地址,共同指向同一对象。或者两者的对象成员也存着相同地址指向同一对象,就是浅拷贝。
第一个例子:
把a赋值给b,是把变量a的地址拷贝给了b,他俩都在栈中存了相同的地址,这两个地址指向同一个对象。通过变量b改变对象的属性,再用变量a再次调用该属性,得到的结果是改变后的。
第二个例子:
此时a和b分别存了两个地址,也就是说指向了两个对象,二者不是同一个。
但是他俩的z属性是咋回事?我来告诉你,a.z存的是一个地址,赋值给b.z的也是同一个地址。二者指向同一个对象。和第一个例子一样。
深拷贝:
深是浅的反义词,综上例,变量a与b,让他俩指向不同的对象就行了,且多层嵌套的子对象也要分别存在两个地址。
这里示范两个可以做到深拷贝的方法:
第一个(看不懂API的去查文档):
JSON.parse(JSON.stringify(obj))
PS:存在大bug,JSON.stringify()会忽略函数和undefined,会把Date实例转为字符串。也就是说你不可能用这个方法实现完美拷贝,如果对象里面有上述几个数据类型,那就完了。
第二个(自己封装一个方法):
这个方法不能拷贝函数,Date实例,正则实例,不信你试试。
PS:如果一个对象的一个属性指向了自身,我们叫它环,用上面两种方法拷贝它,全报错。见下例: