递归实现:
/**
* 深拷贝
* @param {*} obj
* @returns
*/
function deepClone(obj={}){
// 存储当前层数据
let result;
// 不是对象、数组 或者为null,那么直接返回
if(typeof obj !=='object' || obj==null)
return obj;
if(obj instanceof Array)
result=[];
else
result={};
// 数组、对象都可用 for in 遍历,数组的key是索引值
for(let key in obj){
// 保证key是obj自己身上的属性,而不是其原型对象上的属性
if(obj.hasOwnProperty(key)){
// 递归调用
result[key]=deepClone(obj[key]);
}
}
// 返回当前层数据
return result;
}
注意:只有判断是否为null时使用==null(因为null==undefined-->true),其他判断是否相等的都用===,因为==会发生强制类型转换,只判断转换后的值是否相等;而===会判断类型是否相同,类型相同才会判断值是否相等。