1.简单的深拷贝
// 利用json.parse和json.stringfly来进行深拷贝
// obj 需要深拷贝的对象
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj))
}
缺点:
- json在转换的过程中不识别函数和symbol
- 对象有个inner属性指向他自己,如果用了json转换之后就不可以了,会报错
2. 手写实现深拷贝
// 需要首先判断传入的对象是否为一个数组
function isArray (arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
}
function deelClone(obj) {
// 对常见的“非”值,直接返回原来值
if([null, undefined, NaN, false].includes(obj)) return obj;
if(typeof obj !== "object" && typeof obj !== 'function') {
//原始类型直接返回
return obj;
}
var objD = isArray(obj) ? [] : {};
for(let i in obj) {
//检测一个对象是否含有特定的自身属性
if(obj.hasOwnProperty(i)){
objD[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return objD;
}