概念和定义
- 定义: 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
- 浅拷贝:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
- 深拷贝:在计算机中开辟一块新的内存地址用于存放复制的对象。
完全拷贝
1.
var obj = {
a:2,
b:3,
o: {
x: 100
}
}
var objStr = JSON.stringify(obj);
var obj2 = JSON.parse(objStr);
obj2.o.x = 1000;
consolo.log(obj2.o.x); // 1000
consolo.log(obj.o.x); // 10
2.
var obj = {
name: 'wsscat',
age: 0
}
var deepCopy = function(source) {
var result = {};
for(var key in source) {
if(typeof source[key] === 'object') {
result[key] = deepCopy(source[key])
} else {
result[key] = source[key]
}
}
return result;
}
var obj3 = deepCopy(obj)
obj.name = 'autumns';
console.log(obj);//Object {name: "autumns", age: 0}
console.log(obj3);//Object {name: "wsscat", age: 0}
不完全拷贝
- for in 的方法只能拷贝第一层 ```javascript // for in 的方法只能拷贝第一层, 引用数据类型无法拷贝 var obj = { name: ‘wsscat’, age: 0, arr: [1, 2, 3] }
var obj2 = {};
for (var p in obj) { obj2[p] = obj[p]; } obj2.age = 100; console.log(obj.age);
obj2.arr.push(4); console.log(obj.arr)
4. es6的扩展运算符得到的对象也是只拷贝第一层
```javascript
var obj1 = {
name: 'zs',
age: 18,
arr: [1, 2, 3]
}
var obj2 = {
...obj1
}
obj2.age = 20;
console.log(obj1.age);
obj2.arr.push(4);
console.log(obj1.arr);