定义
浅拷贝:浅拷贝是指只复制一层对象的属性,不会复制对象中的对象的属性
深拷贝:指完全的拷贝了一个对象,会复制对象中层层嵌套的对象的属性。如果对象内嵌套对象类型的值,那么拷贝的不是是引用的指针,而是整个值。
实现
深拷贝
如果不考虑拷贝函数的情况,那么最简单粗暴的方法就是JSON.parse
和JSON.stringify
var obj = {
obj: {name: 'innerObj'},
arr: [1,2],
fn: function(a){a++}
},
arr = [function(a){a++}, {name: 'arr'}, 1];
JSON.parse(JSON.stringify(obj)) // {arr: [1,2], obj: {name: 'obj'}}。fn丢失了
JSON.parse(JSON.stringify(arr)) // {null, obj: {name: 'arr', 1}}。函数变成了null
在其他博客看到了一种适用于所有情况的方法,代码如下。但我觉得还是有问题。
var deepCopy = function(obj) {
if (typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; // 注意这行代码
}
}
return newObj;
}
var arr = [function(){
console.log(a)
}, {
b: function(){console.log(b)
}],
new_arr = deepCopy(arr);
arr[0] === new_arr[0] // true
new_arr[1].b === arr[1].b // true
上面代码片段,如果是函数,typeof
返回的是function
,所以我认为这段代码复制的是引用函数的指针,并不是完全的深拷贝。
浅拷贝
const shallowCopy = (obj) => {
if(typeof obj !== 'object') return
let newObj = obj instanceof Array? [] : {}
for(var key in obj){
if ( obj.hasOwnProperty(key) ) newObj[key] = obj[key]
}
return newObj
}