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 相关文章推荐
js类 from qq
Nov 13 Javascript
JS 显示当前日期与时间的代码
Mar 24 Javascript
JQuery Highcharts 动态生成图表的方法
Nov 15 Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
ES6概念 ymbol.for()方法
Dec 25 Javascript
js实现横向拖拽导航条功能
Feb 17 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
JavaScript实现tab栏切换效果
Mar 16 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
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python快速排序代码实例
2013/11/21 Python
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
RC4文件加密的python实现方法
2015/06/30 Python
Django保护敏感信息的方法示例
2019/05/09 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
生产部经理岗位职责
2013/12/16 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android