irpas技术客

js中浅拷贝与深拷贝的区别及实现方法_新生码农小菜鸟_js浅拷贝和深拷贝的区别

大大的周 2106

浅拷贝:

浅拷贝就是只拷贝一层,更深层次对象级别只拷贝引用(地址)

当拷贝的新对象发生改变时,原对象也会发生相同的改变,也就是说,浅拷贝会影响原来的元素

实现方法: 1、直接赋值法: var arr = [1,2,3] var newarr = arr; newarr[1] = 5; console.log(arr,newarr);

输出:[1, 5, 3],[1, 5, 3]

var obj = { name:'小明', age:18, car:{ a:'三轮车' } } var newobj = obj; newobj.car = "电动车" console.log(obj,newobj);

输出:{name: '小明', age: 18, car: '电动车'},{name: '小明', age: 18, car: '电动车'}

2、Object.assign(参数1,参数2)

此方法类似于将对象合并,如果参数1与参数2key值相同,参数2的值会覆盖参数1

let obj ={ name:'小明', sex:'男', car:{ a:"电动车" } } let obj1 ={ name:'小红', sex:'女', age:20 } let newobj = Object.assign(obj,obj1); newobj.a = "宝马" console.log(newobj); console.log(obj);

输出:

{age:?20 ,car:?{a:?'宝马'} ,name:?"小红" ,sex:?"女"}

{age:?20 ,car:?{a:?'宝马'} ,name:?"小红" ,sex:?"女"}

深拷贝:

深拷贝拷贝多层,每一级的数据都会拷贝 深拷贝只拷贝内容,两个对象拥有不同的地址

当拷贝出来的对象发生改变时,原对象内容不会改变,两者互不影响

实现方法: 1、使用JSON let obj ={ name:'小明', sex:'男', car:{ a:"电动车" } } let obj1 = JSON.stringify(obj); let newobj = JSON.parse(obj1); newobj.name="小李"; newobj.sex="女"; console.log(obj); console.log(newobj);

输出:

{name: '小明', sex: '男', car: {a:?'电动车'}}

{name: '小李', sex: '女', car: {a:?'电动车'}}

2、根据属性进行深拷贝: var obj = { id: 1, name: 'andy', msg: { age: 18 }, color: ['pink', 'red'] } var o = {}; //封装函数 function deepCopy(newobj,oldobj){ for(var k in oldobj){ //判断我们的属性值属于那种数据类型 //1、获取属性值 oldobj[k] var item = oldobj[k]; // console.log(item); 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; } } } deepCopy(o,obj); console.log(o);

输出:{id: 1, name: 'andy', msg: {?age:?18 }, color: ['pink',?'red']}

3、使用解构赋值和剩余值进行深拷贝 let obj ={ name:'小明', age:18, color:['black','yellow'], msg:{ a:'我想你' } } let {...o} = obj o.age=20 console.log(o); console.log(obj);

输出:{name: '小明', age: 20, color: ['black','yellow'], msg: {a:?'我想你'}}

{name: '小明', age: 18, color: ['black','yellow'], msg: {a:?'我想你'}}


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #js浅拷贝和深拷贝的区别 #arr #1 #2 #3