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 相关文章推荐
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
三级下拉菜单的js实现代码
May 23 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
禁止空格提交表单的js代码
Nov 17 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
Dec 15 Javascript
vue+iview+less 实现换肤功能
Aug 17 Javascript
微信网页登录逻辑与实现方法
Apr 29 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
Dec 06 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 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输入流php://input使用浅析
2014/09/02 PHP
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
js倒计时小程序
2013/11/05 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python模块之re正则表达式详解
2017/02/03 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
Django xadmin安装及使用详解
2020/10/26 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
EJB的激活机制
2013/10/25 面试题
JPA的特点
2014/10/25 面试题
公司开业庆典主持词
2014/03/21 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
入党推优材料
2014/06/02 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers