摘要:学习深浅复制总结,深复制和浅复制只针对像 Object、Array 这样的复杂对象,不考虑基本数据类型 null、undefined、string、number 和 boolean
浅复制
浅复制只会将对象的各个属性依次复制,并不会进行递归复制。因为只是复制了指向同一块内存的地址,所以彼此之间的操作还会互相影响。比如数组的 slice 和 concat 方法Array对象
1 | // 数组方法 |
深复制
深复制是在堆中重新分配内存,并将目标对象进行递归复制(性能会受影响),复制后的对象与原来的对象是完全隔离的
1 | function _deepCopy(obj, map = new WeakMap()) { |
还有一种简单粗暴的方法:使用JSON.stringify
解决。但这个方法有局限性:undefined、function、symbol(ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的对象都不符合 JSON 结构标准,支持 JSON 的语言无法处理它们就会出现错误。其中 undefined、function 和 symbol 在对象中会自动被忽略,在数组中则会返回 null(以保证单元位置不变)JSON 与 JSONP
1 | var objC = {name: undefined, age: null, say: function(){}}; |