浅拷贝:
思路----------把父对象的属性,全部拷贝给子对象,实现继承。
问题---------如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,不会开辟新栈,不是真正拷贝,因此存在父对象被篡改的可能。
代码:
function deepCopy(o){ var f = {}; for(i in o){ f[i] = o[i]; }; return f }
深拷贝:
思路-----------递归调用'浅拷贝',可以解决子对象修改时会污染父对象,此时两个对象指向的不是一个内存地址。
代码:
function deepCopy(p,c){ // p 父级对象 c 子集对象 var c = c || {}; for(let i in p){
// 如果父级对象的其中一个属性是对象 if(typeof p[i]==='object'){
c[i] = (p[i].constructor===Array)?[]:{}; //通过判断父级对象的属性的constructor的类型,指定子集对象属性的类型
deepCopy(p[i],c[i])}; //递归调用自身进行深层拷贝
else{
// 其他情况直接赋值 c[i] = p[i] } } return c; }