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程序中美元符号$是什么
Jun 05 Javascript
javascript prototype,executing,context,closure
Dec 24 Javascript
JS小框架 fly javascript framework
Nov 26 Javascript
jquery下实现overlay遮罩层代码
Aug 25 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
Aug 24 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
Angularjs 实现动态添加控件功能
May 25 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
postman+json+springmvc测试批量添加实例
Mar 31 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 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和MySQL保存和输出图片
2006/10/09 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
微信access_token的获取开发示例
2015/04/16 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
PHP CURL使用详解
2019/03/21 PHP
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
JS实现随机点名器
2020/04/12 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
解析Python中的异常处理
2015/04/28 Python
Python unittest模块用法实例分析
2018/05/25 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python实现简单的2048小游戏
2021/03/01 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
git stash(储藏)的用法总结
2022/06/25 Servers