js中的{}与[]的深度克隆
2021-09-27 本文已影响0人
她与星河皆遗憾
数组与对象直接克隆,克隆类中的数组只是获得了原始类中的数组指向。原始类和克隆类中的数组指向同一个空间,当你需要操作克隆类中的数组时,原始类的数组也会跟着改变。
deepClone (obj) {
// 对常见的“非”值,直接返回原来值
if([null, undefined, NaN, false].includes(obj)) {
return obj;
}
// 原始类型直接返回
if(typeof obj !== "object" && typeof obj !== 'function') {
return obj;
}
// 判断是数组还是对象
var o = Object.prototype.toString.call(obj) === '[object Array]' ? [] : {};
for(let i in obj) {
// 判断所得的属性是否是自身的属性,不能使用原型链上的属性
if(obj.hasOwnProperty(i)){
// 判断是原始值还是对象值,然后循环递归
o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return o;
}