JavaScript-浅克隆和深克隆
浅拷贝
function clone(origin,target){ for(var prop in origin){ if(origin.hasOwnProperty(prop)){ target[prop] = origin[prop]; } } return target; }
上述代码实现了浅拷贝,浅拷贝就是当遇到引用数据类型的时候,只拷贝它的引用值,而不深层拷贝它本身的值,所以用浅拷贝来拷贝对象的时候,会出现如下状况:
var person1 = {}; clone(person,person1); person1.likeColors.push("black"); console.log("person color:" + person.likeColors); console.log("person1 color:" + person1.likeColors);
结果会是:
浅拷贝拷贝来的对象并不是完全独立的对象,当拷贝来的对象或被拷贝的对象修改它们的引用数据类型值的时候,它们都会同步发生变化,因为它们引用所指向的堆内存地址是相同的。
深拷贝
用递归的方式实现
function deepClone(target){ var result; var str = "[object Object]"; if(typeof target === 'object'){ if(Array.isArray(target)){ result = []; for(let i in target){ result.push(deepClone(target[i])); } }else if(target === null || target === undefined){ result = target===null?null:undefined; }else if(target.constructor === RegExp){ result = target; }else if(target instanceof Object){ result = {}; for(let i in target){ result[i] = deepClone(target[i]); } }else if(target instanceof date){ result = target; } }else{ result = target; } return result; }
运行效果:
这知识它不进脑子啊。。。