助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
## 1.浅拷贝 * 拷贝就是把父对像的属性,全部拷贝给子对象。 * 浅拷贝就是数据双向改变。 * JavaScript存储对象都是存地址的。 * 浅拷贝会导致 obj1 和obj2 指向同一块内存地址。改变了其中一方的内容,都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变。 ``` var obj1 = {//浅拷贝 'name' : 'zhangsan', 'age' : '18', }; var obj2 = obj1; obj2.name = '987654' console.log(obj1.name) //987654 console.log(obj2.name) //987654 //浅拷贝,双向改变,指向同一片内存空间 var arr1 = [1, 2, 3]; var arr2 = arr1; arr1[0] = 'change'; console.log('shallow copy: ' + arr1 + " ); //shallow copy: change,2,3 console.log('shallow copy: ' + arr2 + " ); //shallow copy: change,2,3 ``` ## 2、深拷贝:是开辟一块新的内存地址,将原对象的各个属性逐个复制进去。对拷贝对象和源对象各自的操作互不影响。 1、使用递归的方式实现深拷贝 ``` //使用递归的方式实现数组、对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 var objClone = Array.isArray(obj) ? [] : {}; //进行深拷贝的不能为空,并且是对象或者是 if (obj && typeof obj === "object") { for (key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepClone1(obj[key]); } else { objClone[key] = obj[key]; } } } } return objClone; } ``` 2、通过 JSON 对象实现深拷贝 ``` function deepClone2(obj) { var _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone; } var obj1 = { 'name' : 'pengyaping', 'age' : '18', }; var a = deepClone2(obj1).name = '45456465' console.log(a) // 45456465 console.log(obj1.name) //pengyaping ``` > JSON对象实现深拷贝的一些问题 * 无法实现对对象中方法的深拷贝 ## 3、通过jQuery的extend方法实现深拷贝 ``` var array = [1,2,3,4]; var newArray = $.extend(true,[],array); ``` ## 4、运用到js的 for in ``` var obj1 = { 'name' : 'pengyaping', 'age' : '18', }; function cloneObject(object){ var newObject = {}; for(var i in object){ newObject[i] = object[i]; } return newObject; } var a = cloneObject(obj1).name= '12313' console.log(a) console.log(obj1) ```