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 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
Jan 17 Javascript
jQuery LigerUI 使用教程入门篇
Jan 18 Javascript
javascript右下角弹层及自动隐藏(自己编写)
Nov 20 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
Apr 07 Javascript
jquery css 设置table的奇偶行背景色示例
Jun 03 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
实例教学如何写vue插件
Nov 30 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 Javascript
Vue自定义属性实例分析
Feb 23 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代码
2006/12/06 PHP
隐性调用php程序的方法
2009/03/09 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
Smarty模板语法详解
2019/07/20 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
three.js 入门案例详解
2018/01/23 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
说一说Python logging
2016/04/15 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python生成excel的实例代码
2017/11/08 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
简历中自我评价怎么写
2014/02/12 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
党在我心中演讲稿
2014/09/02 职场文书
健康状况证明模板
2014/10/23 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python