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 相关文章推荐
javascript 三种编解码方式
Feb 01 Javascript
JQuery在光标位置插入内容的实现代码
Jun 18 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
JS比较2个日期间隔的示例代码
Apr 15 Javascript
微信JSSDK上传图片
Aug 23 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
node.js实现登录注册页面
Apr 08 Javascript
AngularJS实现动态添加Option的方法
May 17 Javascript
Vue响应式原理深入解析及注意事项
Dec 11 Javascript
微信小程序block的使用教程
Apr 01 Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 jQuery
手把手教你用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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
php三元运算符知识汇总
2015/07/02 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
2018/09/29 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
信息工作经验交流材料
2014/05/28 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
企业宣传稿范文
2015/07/23 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
交通事故协议书范本
2016/03/19 职场文书
mysql left join快速转inner join的过程
2021/06/30 MySQL
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python