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 Tab 导航插件 (23个)
Jun 11 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
jQuery基本过滤选择器使用介绍
Apr 18 Javascript
javascript自定义startWith()和endWith()的两种方法
Nov 11 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
Jun 20 Javascript
每日十条JavaScript经验技巧(二)
Jun 23 Javascript
深入Node TCP模块的理解
Mar 13 Javascript
JS简单数组排序操作示例【sort方法】
May 17 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
JavaScript实现点击切换功能
Jan 27 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Python持续监听文件变化代码实例
2020/07/22 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
html Table 表头固定的实现
2019/01/22 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
通信生自我鉴定
2014/01/18 职场文书
用Python实现Newton插值法
2021/04/17 Python
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python