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 相关文章推荐
js函数的引用, 关于内存的开销
Sep 17 Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
Jul 10 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
Node.js中使用socket创建私聊和公聊聊天室
Nov 19 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
微信小程序开发入门基础教程
Apr 19 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
vue 取出v-for循环中的index值实例
Nov 09 Javascript
JavaScript代码简化技巧实例解析
Sep 09 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模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php获取图片信息的方法详解
2015/12/10 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
围观tangram js库
2010/12/28 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
安装dbus-python的简要教程
2015/05/05 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
网络安全方面的面试题
2015/11/04 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
升职自荐信范文
2013/10/05 职场文书
岗位职责的定义
2013/11/10 职场文书
自我鉴定书面格式
2014/01/13 职场文书
家长会学生演讲稿
2014/04/26 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
长城英文导游词
2015/01/30 职场文书
辞职信标准格式
2015/02/27 职场文书
个人求职意向书
2015/05/11 职场文书
大学生实习证明
2015/06/16 职场文书
入党申请书怎么写?
2019/06/11 职场文书