JavaScript基础教程——JavaScript中的浅拷贝与深拷贝
小职 2020-10-13 来源 : 阅读 517 评论 0

摘要:本篇介绍了JavaScript基础教程——JavaScript中的浅拷贝与深拷贝,希望对JavaScript的学习有所帮助。

本篇介绍了JavaScript基础教程——JavaScript中的浅拷贝与深拷贝,希望对JavaScript的学习有所帮助。

JavaScript基础教程——JavaScript中的浅拷贝与深拷贝


浅拷贝

在使用JavaScript对数组进行操作的时候,如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生

 

var arr = ['aa','bb','cc'];

 

var arr2 = arr;

 

arr2[0] = '新来的';

 

console.log(arr);//输出 '新来的','bb','cc'

 

由此可见对数组arr2进行修改时,而arr内数据也会随之改变。这种直接赋值的方式就是浅拷贝现象。那到底是为什么呢?

 

因为JavaScript存储对象都是存地址的,所以浅复制会导致 arr 和 arr2 指向同一块内存地址,大概的示意图如下。

 

 

 

所以当修改arr2中的数据时,由于arr也指向此处,所以arr的数据也就被“修改了”。

 

深拷贝

一般都是开辟一块新的内存地址,将原对象的各个属性逐个复制出去。如下图所示

 

 

 

 

所以当修改arr2中的数据时,由于arr与arr2地址不同,所以arr的数据还是原来的。

 

数组的深拷贝

var arr = ['aa','bb','cc'];

 

var arr2 = arr.slice(0);

 

arr2[0] = "新来的";

 

console.log(arr);//输出:数组的原始值:'aa','bb','cc'

 

console.log(arr2);//输出:数组的新值:'新来的','bb','cc'

 

Json的深拷贝

在这里利用JSON下的两个方法来实现对象的深拷贝。

 

var json = {a:12,b:5};

 

var str = JSON.stringify(json);//这里将json内的数据转换成一个字符串存起来

 

var json2 = JSON.parse(str);//这里将字符串的内容"还原"成原来的"面目"

 

console.log(json2);//输出 {a:12,b:5}

 

总结

其实在js中还有很多方法能进行深拷贝,例如利用数组下的cancat方法;对Json进行遍历然后给新的对象等等。

 

补充

以上只考虑了纯数组或者纯对象(json串)的情况,当互相嵌套时确实有问题,经过查阅资料找到了一个函数

 

function cloneObject( obj, deep ){

 

if ( obj === null || obj === undefined || typeof (obj) !== 'object' ){

 

return obj;

 

}

 

var deep = !!deep;

 

var cloned = null;

 

if ( obj.constructor === Array ){

 

if ( deep === false ) return obj;

 

cloned = [];

 

for ( var i in obj ){

 

cloned.push( cloneObject( obj[i], deep ) );

 

}

 

return cloned;

 

}

 

cloned = {};

 

for ( var i in obj ){

 

cloned[i] = deep ? cloneObject( obj[i], true ) : obj[i];

 

}

 

return cloned;

 

}

 

var arr = [1, 3, 5, {a: 5}]

 

var newArr =cloneObject(arr,true);

 

newArr[3].a = 9

 

console.log(arr, newArr)



关注“职坐标在线”公众号,免费获取最新技术干货教程资源哦!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程