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 相关文章推荐
学习YUI.Ext基础第一天
Mar 10 Javascript
Prototype Function对象 学习
Jul 12 Javascript
javascript innerText和innerHtml应用
Jan 28 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
Nov 17 Javascript
js比较日期大小的方法
May 12 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
Jun 21 Javascript
图解prototype、proto和constructor的三角关系
Jul 31 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
Sep 08 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
Jan 22 Javascript
javascript笔记之匿名函数和闭包
Feb 06 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 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设计模式 Builder(建造者模式)
2011/06/26 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
php处理带有中文URL的方法
2016/07/11 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
js中的 || 与 &amp;&amp; 运算符详解
2018/05/24 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
wxPython色环电阻计算器
2019/11/18 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
简单说说tomcat的配置
2013/05/28 面试题
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
个人授权委托书
2014/04/03 职场文书
银行进社区活动总结
2014/07/07 职场文书
寒山寺导游词
2015/02/03 职场文书
《失物招领》教学反思
2016/02/20 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Python中的程序流程控制语句
2022/02/24 Python