JavaScript的数据类型分为基本数据类型和引用数据类型。深浅拷贝都是对于引用数据类型而言的,复杂的引用类型将地址存在 Stack 里,数据存在 Heap
浅拷贝即直接使用=赋值,只是对地址的复制,存在Heap中的数据是相同的.
深拷贝就是对目标的完全拷贝,不同的地址,指向Heap中不同的数据.
深拷贝可分为首层深拷贝与完全深拷贝,首层深拷贝是指对于多层嵌套的引用类型数据只对深拷贝首层数据,更深层的数据还是浅拷贝.如
- 数组的 concat 和 slice
- ... 展开运算符
- Underscore 的 _.clone()
目前实现完全深拷贝的方法主要是:
- 利用 JSON 对象中的 parse 和 stringify
- jquery的$.extend(true, {}, obj)
- lodash的_.cloneDeep和_.clone(value, true)。
- 利用递归来实现每一层都重新创建对象并赋值