JS实现数组深拷贝的方法分析


Posted in Javascript onMarch 06, 2019

本文实例讲述了JS实现数组深拷贝的方法。分享给大家供大家参考,具体如下:

最近在网上看到一篇关于js数组复制最有效的方法是直接使用slice和concat方法。这2个方法的确是最快的把数组成功复制,而不是引用。可以运行实例:

<script type="text/javascript">
<!--
  var arr1=["1","2","3"],arr2;
  arr2=arr1.slice(0);
  arr1[0]=0; //改变arr1第一个元素
  alert("arr2[0]:"+arr2[0]); //不影响arr2
  var arr3=["1","2","3"],arr4;
  arr4=arr3.concat();
  arr3[0]= 0; //改变arr3第一个元素
  alert("arr4[0]:"+arr4[0]); //不影响arr4
</script>

运行结果可以看到改变原来数组中的元素并不影响拷贝后的数组。但是如果我们把上面例子中的a1换成[["1","2","3"],"2","3"],也就是二维数组,情况就不一样了。

<script type="text/javascript">
<!--
  var a1=[["1","2","3"],"2","3"],a2;
  a2=a1.slice(0);
  a1[0][0]=0; //改变a1第一个元素中的第一个元素
  alert(a2[0][0]); //影响到了a2
-->
</script>

可以看到这2个方法只是复制了数组的第一维,由于数组第一维存放的是第二维的引用,而第二维才是实际存放他们的内容。就此我们可以联想到网上流行的复制对象的函数,其实也只是复制对象的第一层。

<script type="text/javascript">
<!--
  function extend(destination,source)
  {
    for(var property in source)
    {destination[property]=source[property];}
  }
-->
</script>

所以要想深层复制对象,还得在该函数基础上修改下。完整实例如下:

<script type="text/javascript">
<!--
  function getType(o)
  {
    var _t;
    return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();
  }
  function extend(destination,source)
  {
    for(var p in source)
    {
      if(getType(source[p])=="array"||getType(source[p])=="object")
      {
        destination[p]=getType(source[p])=="array"?[]:{};
        arguments.callee(destination[p],source[p]);
      }
      else
      {
        destination[p]=source[p];
      }
    }
  }
  var test={a:"ss",b:"dd",c:{d:"css",e:"cdd"}};
  var test1={};
  extend(test1,test);
  test1.c.d="change"; //改变test1的c属性对象的d属性
  alert(test.c.d); //不影响test
-->
</script>

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》

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

Javascript 相关文章推荐
javascript nextSibling 与 getNextElement(node) 使用介绍
Oct 13 Javascript
jquery ajax post提交数据乱码
Nov 05 Javascript
JavaScript严格模式详解
Nov 18 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
Oct 12 Javascript
jquery二级目录选中当前页的css样式
Dec 08 Javascript
jQuery实现复选框的全选和反选
Feb 02 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
Node.js文件编码格式的转换的方法
Apr 27 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 #Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 #Javascript
微信小程序性能优化之checkSession的使用
Mar 06 #Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
Mar 06 #Javascript
移动端(微信等使用vConsole调试console的方法
Mar 05 #Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 #Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 #Javascript
You might like
PHP session会话的安全性分析
2011/09/08 PHP
php实现递归的三种基本方式
2020/07/04 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Python selenium 三种等待方式解读
2016/09/15 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python输出数学符号实例
2020/05/11 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
初二生物教学反思
2014/02/03 职场文书
《自然之道》教学反思
2014/02/11 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
中班下学期个人总结
2015/02/12 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
详细介绍python类及类的用法
2021/05/31 Python
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS