- 深拷贝可以理解为递归进行浅拷贝。
- 简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级
浅拷贝实现
1.1
2
3
4
5
6
7
8
9
10
function shallowClone (copyObj) {
var obj = {}
for (var prop in copyObj) {
if (copyObj.hasOwnProperty(prop)) {
obj[prop] = copyObj[prop]
}
}
return obj;
}
Object.assign()
Array的slice和concat方法
- 它看起来像是深拷贝。而实际上它是浅拷贝: 如果该元素是个对象引用, 两个对象引用都引用了同一个对象, 所以会同变
- 如果向两个数组任一中添加了新元素,则另一个不会受到影响
深拷贝的实现
- 对于字符串、数字及布尔值来说 没有深浅之分
JSON对象的parse和stringify
JSON.parse(JSON.stringify(source))
这种方法使用较为简单,可以满足基本的深拷贝需求,而且能够处理JSON格式能表示的所有数据类型,
但是对于正则表达式类型、函数类型等无法进行深拷贝(而且会直接丢失)。还有一点不好的地方是它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。同时如果对象中存在循环引用的情况也无法正确处理。Object.create(source)
1
2
3
4
5
6function copy(obj) {
var F = function () {
};
F.prototype = obj;
return new F();
}是在方法内部创建了一个 function 原型指向传入的 old对象,再返回一个 function 实例,也就是拷贝出来的值,所以添加改变实例属性不会影响原型,但是修改 old 对象的属性值,也就是改变了实例的原型属性,新的对象的所有属性都是继承自 old 对象,自然会跟着变