标题JSON.parse(JSON.stringify())进行深拷贝的问题
问题描述:
对函数拷贝,报错 对数组拷贝,值为null,undefined,NaN,fn 会被转换为null
对对象拷贝,与数组转换类似,不同的是当对象某属性的属性值为undefined时,该属性不被拷贝
上代码:
const log = console.log.bind(document);
function a(){
log(12)
}
const data = [0,"a",null,undefined,NaN,a,{
a:0,
b:a,
c:undefined,
d:null,
f:NaN,
e:function(){},
}];
log(data)
log(JSON.parse(JSON.stringify(data)))
/** 0: 1
1: "a"
2: null
3: null
4: null
5: {a: 1, b: 'a', d: null, f: null}
*/
利用递归实现深度拷贝
log(deepCopy(data))
//辅助函数,判断类型
function checkType(data){
return Object.prototype.toString.call(data).slice(8,-1);
}
//深度拷贝
function deepCopy(data){
let obj;
// 判断类型
const type = checkType(data);
if(type === 'Object'){
obj = {};
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const val = data[key];
obj[key] = deepCopy(val);
}
}
}else if(type === 'Array'){
obj = [];
for (const val of data) {
obj.push(deepCopy(val));
}
}else{
return data;
}
return obj;
}