浅拷贝和深拷贝
1.浅拷贝的方法,只能拷贝一层数据,更深层次对象级别的只拷贝引用地址
for...in...
// (1)利用for...in...遍历对象,k表示对象属性名,obj[k]表示对象属性值 var obj={ id:1, name:"andy", other:{ age:18, height:180, } } var o={} for(var k in obj){ o[k]=obj[k] } // console.log(o) o.other.age=20 console.log(obj)
Object.assign(拷贝给谁,需要拷贝的数据) es6写法
// (2)使用Object.assign(拷贝给谁,需要拷贝的数据)实现浅拷贝 var obj={ id:1, name:"andy", other:{ age:18, height:180, } } var o={} Object.assign(o,obj) o.other.age=20 o.name="bob" console.log(o) console.log(obj)
2.深拷贝拷贝多层,每一层的数据都可以拷贝
(1)利用递归的方式实现深拷贝
// (1)利用递归的方式实现深拷贝 var obj={ id:1, name:"andy", other:{ age:18, height:180, }, color:['pink','red'] } var o={} // 封装函数 function deepCopy(newobj,oldobj){ for(var k in oldobj){ // 判断属性属于那种数据类型 // 获取属性值 oldobj[k] var item=oldobj[k] // 判断是否是数组,数组要写在上面,因为数组也属于对象 if(item instanceof Array){ newobj[k]=[] deepCopy(newobj[k],item) } // 判断是否是对象 else if(item instanceof Object){ newobj[k]={} deepCopy(newobj[k],item) } // 判断是否是基本数据类型 else{ newobj[k]=item } } // console.log(item) } deepCopy(o,obj) console.log("o"+o) o.color[1]='yellow' console.log("obj"+obj)
(2)JSON.parse(JSON.stringify(需要拷贝的对象))
局限性:拷贝的对象如果有函数、undefined,经过JSON.stringify序列化之后的字符串中这个键值对会消失;
拷贝RegExp引用类型会变成空对象;
// JSON.parse(JSON.stringify()) var obj={ id:1, name:"andy", other:{ age:18, height:180, }, color:['pink','red'] } var o={} o=JSON.parse(JSON.stringify(obj)) o.color[1]='blue' console.log("o",o) console.log("obj",obj)