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 DOM 学习第九章 选取范围的介绍
Feb 19 Javascript
Js组件的一些写法
Sep 10 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
Jquery图片滚动与幻灯片的实例代码
Apr 08 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
Jul 10 Javascript
Javascript玩转继承(一)
May 08 Javascript
javascript常用的方法整理
Aug 20 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
Angularjs验证用户输入的字符串是否为日期时间
Jun 01 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
Jul 30 Javascript
vue中使用rem布局代码详解
Oct 30 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中Cookie与Session的异同
2016/02/19 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
PyQt5实现下载进度条效果
2018/04/19 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
煤矿安全承诺书
2014/05/22 职场文书
初三英语教学计划
2015/01/23 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android