1、浅拷贝
var obj = {a:10}; //定义一个对象 function copy(obj){ //定义一个复制对象的方法,参数就是要复制的对象 var newObj = {}; //定义一个空对象,用来保存key和value for ( var key in obj) { //遍历传入的对象 newObj[key] = obj[key]; //将传入的对象的key和value存入新对象中 } return newObj; //将新对象作为返回值,返回到外面 } var obj2 = copy(obj); //将obj复制给obj2 obj2.a = 20; //改变obj2中的a的值为20 console.log(obj.a); //obj中a的值不变 10
但是这里存在一个问题,如果a的值是一个对象,例如:var obj = {a: {b: 10}};
在使用for in 遍历时,新对象会同时指向a的内存地址,导致修改新对象的值会对原对象有影响;
遇到这种情况时,我们需要深拷贝。
2、深拷贝
var obj = {a:{b:10}};//定义一个对象 function deepCopy(obj){//定义一个复制对象的方法,参数就是要复制的对象 if(typeof obj != 'object'){ //如果这个参数的类型不是object return obj; //那么直接返回这个参数 } var newObj = {}; //否则定义一个空对象,用来保存key和value for ( var attr in obj) {//遍历传入的对象 newObj[attr] = deepCopy(obj[attr]); //用递归的方式将对象中属性的key和value存入新对象中 } return newObj;//将新对象作为返回值,返回到外面 } var obj2 = deepCopy(obj);//将obj复制给obj2 obj2.a.b = 20;//改变obj2中的属性a中b的值为20 console.log(obj.a.b); //obj中属性a中b的值不变 10