JavaScript深拷贝和浅拷贝概念与用法实例分析


Posted in Javascript onJune 07, 2018

本文实例讲述了JavaScript深拷贝和浅拷贝概念与用法。分享给大家供大家参考,具体如下:

js中的浅拷贝和深拷贝,只是针对复杂数据类型(ObjcetArray)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。

概念1:浅拷贝

浅拷贝就是指拷贝引用,新生成的引用和原来的引用都是指向同一个对象的实例,彼此之间的操作会相互影响。

概念2:深拷贝

在堆中重新开辟内存,把原引用对应的对象实例中所有的内容进行拷贝,因此保证了深拷贝的对象和原来的对象是完全隔离的,他们之间相互没有影响。

概念3:数组深拷贝的实现

1. 使用for循环

<script type="text/javascript">
  var arr1=['a','b','c'];
  var arr2=[];
  function deepCopy(arr1,arr2){
    for(var i=0;i<arr1.length;i++){
      arr2[i]=arr1[i];
    }
  }
  deepCopy(arr1,arr2);
  arr2[1]='d';
  console.log(arr1);//['a','b','c']
  console.log(arr2);//['a','d','c']
</script>

2. 使用slice()方法

<script type="text/javascript">
  var arr1=['a','b','c'];
  var arr2=arr1.slice(0);
  arr2[1]='d';
  console.log(arr1);//['a','b','c']
  console.log(arr2);//['a','d','c']
</script>

3. 使用concat方法

<script type="text/javascript">
    var arr1=['a','b','c'];
    var arr2=arr1.concat();
    arr2[1]='d';
    console.log(arr1);//['a','b','c']
    console.log(arr2);//['a','d','c']
</script>

概念4:对象的深拷贝

1. 使用for循环

<script type="text/javascript">
  var obj = {
    name: 'FungLeo',
    sex: 'man',
    old: '18'
  }
  function copyObj(obj) {
    let res = {}
    for (var key in obj) {
      res[key] = obj[key]
    }
    return res
  }
  var obj2 = copyObj(obj);
  obj2["name"]="kka";
</script>

2. 借助JSON来实现

<script type="text/javascript">
  var obj = {
    name: 'FungLeo',
    sex: 'man',
    old: '18'
  }
  var obj2=JSON.parse(JSON.stringif(obj));
  obj2["name"]="kka";
</script>

总结:以上就是实现数组和对象深拷贝的一些常用方法,可以结合具体的情形使用适合的方法。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
共享自己写一个框架DreamScript
Jan 20 Javascript
namespace.js Javascript的命名空间库
Oct 11 Javascript
从阶乘函数对比Javascript和C#的异同
May 31 Javascript
JS实现商品倒计时实现代码
May 03 Javascript
JQuery Highcharts 动态生成图表的方法
Nov 15 Javascript
javascript self对象使用详解
Oct 18 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
Oct 24 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
JavaScript中this用法学习笔记
Mar 17 Javascript
小程序外卖订单界面的示例代码
Dec 30 Javascript
Javascript原生ajax请求代码实例
Feb 20 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 Javascript
AngularJS 前台分页实现的示例代码
Jun 07 #Javascript
浅谈PDF.js使用心得
Jun 07 #Javascript
vue better scroll 无法滚动的解决方法
Jun 07 #Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 #Javascript
JavaScript 正则命名分组【推荐】
Jun 07 #Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 #Javascript
vue.js实现标签页切换效果
Jun 07 #Javascript
You might like
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
python程序输出无内容的解决方式
2020/04/09 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
自动化专业本科毕业生求职信
2013/10/20 职场文书
人力资源求职信
2014/05/25 职场文书
2014年内勤工作总结
2014/11/24 职场文书
党小组鉴定意见
2015/06/02 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python