对象深拷贝
function deepClone(o){
if(Array.isArray(o)){
var result = [];
for(var i=0;i<o.length;i++){
result.push(deepClone(o[i]));
}
}else if(typeof o == 'object'){
var result = {};
for(var k in o){
result[k] = deepClone(o[k]);
}
}else{
var result = o;
}
return result;
}
let obj1 = {
name: 'qianguyihao',
age: 28,
info: {
desc: 'hello',
},
color: ['red', 'blue', 'green'],
};
let obj2 = {};
deepCopy(obj2, obj1);
console.log(obj2);
obj1.info.desc = 'github';
console.log(obj2);
// 方法:深拷贝
function deepCopy(newObj, oldObj) {
//遍历对象,依次判断对象的的数据类型
for (let key in oldObj) {
// 获取属性值 oldObj[key]
let item = oldObj[key];
// 判断这个值是否是数组
if (item instanceof Array) {
newObj[key] = [];
deepCopy(newObj[key], item);
} else if (item instanceof Object) {
// 判断这个值是否是对象
newObj[key] = {};
deepCopy(newObj[key], item);
} else {
// 简单数据类型,直接赋值
newObj[key] = item;
}
}
}
var clone = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
if(obj.constructor === RegExp) return new RegExp(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
// 使用arguments.callee解除与函数名的耦合
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val;
}
}
return newObj;
};
参考文章:https://github.com/qianguyihao/Web/blob/master/04JavaScript%E5%9F%BA%E7%A1%80/28%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D.md
https://www.cnblogs.com/wangyulue/articles/7684515.html
问题:如何实现深拷贝?
知识点:原型链、for in、递归算法、hasOwnProperty()判断属性是否存在