对于我这种总是难以理解递归人来说,深拷贝总是不那么容易被理解,那我们就先从手写浅拷贝开始吧
浅拷贝的实现
let shallyCopy = function (obj) {
if (typeof obj !== "object") {
return;
}
let newArr = obj instanceof Array ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newArr[key] = obj[key];
}
}
return newArr
};
shallyCopy();
深拷贝的实现
let deepCopy = function (obj) {
if (typeof obj !== "object") {
return;
}
let newArr = obj instanceof Array ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newArr[key] =
typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key];
}
}
return newArr;
};
deepCopy();
深拷贝只需要在浅拷贝的基础上,在赋值时多加上一个判断,如果要赋的值还是对象属性的话,就进行递归
其他深浅拷贝
如果是数组的浅拷贝,通过数组自有的一些方法是可以完成的,如slice,concat等
let arr = ['old', 1, true, null, undefined];
let new_arr = arr.concat();
let new_arr1 = arr.concat()
以上只是浅拷贝,如果数组里面有对象obj的话,新旧数组的对象引用地址还是一样的
可直接使用的深拷贝JSON
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr) );
console.log(new_arr);
这个拷贝真是YYDS,对象也能一样深拷贝过来 但是它不能拷贝函数还有日期之类的数据
var arr = [function(){
console.log(a)
}, new Date(),{
b: function(){
console.log(b)
}
}]
var new_arr = JSON.parse(JSON.stringify(arr));
console.log(new_arr);