深拷贝与浅拷贝

这里只研究对象,不专门研究别数据类型

浅拷贝:

两个变量之间赋值,它们存着相同的地址,共同指向同一对象。或者两者的对象成员也存着相同地址指向同一对象,就是浅拷贝。

第一个例子:

把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:如果一个对象的一个属性指向了自身,我们叫它环,用上面两种方法拷贝它,全报错。见下例:

我擦

结论:JS无法实现所有的,完美的深拷贝!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容