浅析深拷贝与浅拷贝--【godDie】--
--理解深拷贝与浅拷贝,必须要理解值传递与引用传递的概念、
值传递:传递的是基本数据类型的数据(数据不会发生改变)
引用传递:传递的是对象(数组、对象)对象存储在堆空间中,自身可以发生改变
--浅拷贝及其实现的方式
浅拷贝: 当一个对象拷贝另一个对象的数据的时候,只要一个对象的数据发生改变另一个对象的数据也会发生改变 ,因为浅拷贝拷贝的是引用的地址 实现浅拷贝的方式 第一种方式 要求对象必须是多层的状态下才能实现浅拷贝 //ES6 Object.assign() 参数1:target 参数2:对象...... 参数3:对象.... 合并对象 第二种方式 利用jq中的插件机制 $.extend() 除了可以给jquery对象扩展方法外还可以实现深浅拷贝 1、布尔值 如果填true的情况下是深考贝 什么也不写就是浅拷贝 2、目标对象 3......后面所有的对象 都是需要合并的对象 var obj = {a:{name:"张三",age:19}}; var obj1 = {b:{name:"李四",age:19}}; var obj2 = $.extend({},obj,obj1) 第三种方式 要求对象必须是多层的状态下才能实现浅拷贝 function copy(obj){ var newObj = {}; for(var key in obj){ newObj[key] = obj[key]; } return newObj; }
--深拷贝及其实现的方式
深拷贝 当一个对象拷贝另一个对象的数据的时候,其中一个对象的数据发生变化不会影响另一个对象的数据 因为深考贝拷贝的是对象的数据而不是地址 实现深拷贝的方式 第一种方式 对象是单层的情况下 //Object.assign() var obj = {a:1,b:2,c:3} var obj1 = Object.assign({},obj); obj1.a = 30; console.log(obj1,obj) 第二种 该方法差不多比较完美 $.extend()第一个参数是true
var obj = {a:{name:"张三",age:19}}; var obj1 = {b:{name:"李四",age:19}}; var obj2 = $.extend(true,{},obj,obj1); obj2.a.name="胡正阳"; console.log(obj2) console.log(obj) 第三种 JSON.parse JSON.stringfiy
var obj1 = {b:{name:"张三",age:19,show:function(){}}}; var obj2 = JSON.parse(JSON.stringify(obj1)); obj2.b.name = "李四"; console.log(obj1,obj2)