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 写的简单进度条控件
Jan 22 Javascript
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
javascript学习笔记(七) js函数介绍
Jun 19 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
Es6 Generator函数详细解析
Feb 24 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
egg.js的基本使用和调用数据库的方法示例
May 18 Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
jquery 笔记 事件
2011/11/02 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
实例介绍Python中整型
2019/02/11 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
家长会演讲稿范文
2014/01/10 职场文书
三下乡活动方案
2014/01/31 职场文书
20年同学聚会感言
2014/02/03 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android