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使用cookie
Feb 02 Javascript
Javascript this关键字使用分析
Oct 21 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
Dec 12 Javascript
JavaScript数字和字符串转换示例
Mar 26 Javascript
JQuery.Ajax()的data参数类型实例详解
Nov 20 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
js print打印网页指定区域内容的简单实例
Nov 01 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
xmlplus组件设计系列之树(Tree)(9)
May 02 Javascript
微信小程序实现美团菜单
Jun 06 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
Feb 22 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
Aug 08 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
javascript event 事件解析
2011/01/31 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
javascript中Object使用详解
2015/01/26 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
django中使用POST方法获取POST数据
2019/08/20 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
python实现微信打飞机游戏
2020/03/24 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
水果连锁超市创业计划书
2014/01/24 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
驳回起诉裁定书
2015/05/19 职场文书
运动会主持人开幕词
2016/03/04 职场文书