JavaScript实现浅拷贝与深拷贝的方法分析


Posted in Javascript onJuly 05, 2018

本文实例讲述了JavaScript实现浅拷贝与深拷贝的方法。分享给大家供大家参考,具体如下:

平时使用数组复制时,我们大多数会使用‘=',这只是浅拷贝,存在很多问题。比如

let arr = [1,2,3,4,5];
let arr2 = arr;
console.log(arr) //[1, 2, 3, 4, 5]
console.log(arr2) //[1, 2, 3, 4, 5]
arr[0] = 6;
console.log(arr) //[6, 2, 3, 4, 5]
console.log(arr2) //[6, 2, 3, 4, 5]
arr2[4] = 7;
console.log(arr) //[6, 2, 3, 4, 7]
console.log(arr2) //[6, 2, 3, 4, 7]

很明显,浅拷贝下,拷贝和被拷贝的数组会相互受到影响。所以,必须要有一种不受影响的方法,那就是深拷贝。

深拷贝的实现方式有很多种。

一、for循环实现深拷贝

//for循环copy
function copy(arr) {
    let cArr = []
    for(let i = 0; i < arr.length; i++){
      cArr.push(arr[i])
    }
    return cArr;
}
let arr3 = [1,2,3,4];
let arr4 = copy(arr3) //[1,2,3,4]
console.log(arr4) //[1,2,3,4]
arr3[0] = 5;
console.log(arr3) //[5,2,3,4]
console.log(arr4) //[1,2,3,4]

二、slice方法实现深拷贝

//slice实现深拷贝
let arr5 = [1,2,3,4];
let arr6 = arr5.slice(0);
arr5[0] = 5;
console.log(arr5); //[5,2,3,4]
console.log(arr6); //[1,2,3,4]

三、concat实现深拷贝

//concat实现深拷贝
let arr7 = [1,2,3,4];
let arr8 = arr7.concat();
arr7[0] = 5;
console.log(arr7); //[5,2,3,4]
console.log(arr8); //[1,2,3,4]

四、es6扩展运算实现深拷贝

//es6扩展运算实现深拷贝
let arr9 = [1,2,3,4];
let [...arr10] = arr9;
arr9[0] = 5;
console.log(arr9) //[5,2,3,4]
console.log(arr10) //[1,2,3,4]

五、对象的循环深拷贝

//  循环copy对象
let obj = {
    id:'0',
    name:'king',
    sex:'man'
}
let obj2 = copy2(obj)
function copy2(obj) {
    let cObj = {};
    for(var key in obj){
      cObj[key] = obj[key]
    }
    return cObj
}
console.log(obj) //{id: "0", name: "king", sex: "man"}
console.log(obj2) //{id: "0", name: "king", sex: "man"}

六、对象转换成json实现深拷贝

//转换成json
let obj3 = JSON.parse(JSON.stringify(obj));
console.log(obj3) //{id: "0", name: "king", sex: "man"}

七、es6扩展运算实现深拷贝

let {...obj4}= obj
console.log(obj4) //{id: "0", name: "king", sex: "man"}

八、通用深拷贝

var clone = function (v) {
    var o = v.constructor === Array ? [] : {};
    for(var i in v){
      o[i] = typeof v[i] === "object" ? clone(v[i]) : v[i];
    }
    return o;
}

总结:深刻理解javascript的深浅拷贝,可以灵活的运用数组,并且可以避免很多bug。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript实现的分页函数
Dec 22 Javascript
JS中令人发指的valueOf方法介绍
Feb 22 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 Javascript
js实现两点之间画线的方法
May 12 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
Sep 26 Javascript
JS留言功能的简单实现案例(推荐)
Jun 23 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
Oct 15 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
Python版实现微信公众号扫码登陆
May 28 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 #Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 #Javascript
vue两个组件间值的传递或修改方式
Jul 04 #Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 #jQuery
jQuery实现table表格checkbox全选的方法分析
Jul 04 #jQuery
React组件内事件传参实现tab切换的示例代码
Jul 04 #Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 #Javascript
You might like
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
Javascript模块模式分析
2008/05/16 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
浅析Python中signal包的使用
2015/11/13 Python
Python构建网页爬虫原理分析
2017/12/19 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
教师通用专业自荐书范文
2014/02/11 职场文书
税务会计岗位职责
2014/02/18 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
社区综治工作汇报
2014/10/27 职场文书
廉洁自律证明
2015/06/24 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
用Python可视化新冠疫情数据
2022/01/18 Python
Vue+Flask实现图片传输功能
2022/04/01 Vue.js