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 相关文章推荐
编辑浪子版表单验证类
May 12 Javascript
jquery蒙版控件实现代码
Dec 08 Javascript
JQuery自动触发事件的方法
Jun 13 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
Jun 16 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
Feb 10 Javascript
详解vue的数据binding绑定原理
Apr 12 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
关于Vue组件库开发详析
Jul 01 Javascript
JS数组Object.keys()方法的使用示例
Jun 05 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
python中cPickle用法例子分享
2014/01/03 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
通过实例解析python描述符原理作用
2020/01/22 Python
Python3 集合set入门基础
2020/02/10 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
Sql面试题
2013/03/20 面试题
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
《老王》教学反思
2014/02/23 职场文书
我的画教学反思
2014/04/28 职场文书
航空学院求职信
2014/06/11 职场文书
订货会邀请函
2015/01/31 职场文书
西游降魔篇观后感
2015/06/15 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
Django实现聊天机器人
2021/05/31 Python
python区块链持久化和命令行接口实现简版
2022/05/25 Python
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle