javascript进阶篇深拷贝实现的四种方式


Posted in Javascript onJuly 07, 2022

概念介绍

深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象 浅拷贝:不在堆内存中重新开辟空间,只复制栈内存中的引用地址。本质上两个对象(数组)依然指向同一块存储空间

第一种:递归方式(推荐,项目中最安全最常用)

使用递归的方式进行对象(数组)的深拷贝

奉上已封装的深拷贝函数?

//函数拷贝
    const copyObj = (obj = {}) => {
    		//变量先置空
            let newobj = null;  
            //判断是否需要继续进行递归
            if (typeof (obj) == 'object' && obj !== null) {
                newobj = obj instanceof Array ? [] : {};
                //进行下一层递归克隆
                for (var i in obj) {
                    newobj[i] = copyObj(obj[i])
                }
                //如果不是对象直接赋值
            } else newobj = obj;
            return newobj;    
        }

上方函数的使用方式?

//模拟对象
let obj = {
	numberParams:1,
	functionParams:() => {
		console.log('昨天基金全是绿的,只有我的眼睛是红的');
	},
	objParams:{
		a:1,
		b:2
	}
}
const newObj = copyObj(obj); //这样就完成了一个对象的递归拷贝
obj.numberParams = 100;  //更改第一个对象的指
console.log(newObj.numberParams); //输出依然是1 不会跟随obj去改变

第二种:JSON.stringify() ;(这个不推荐使用,有坑)

这个方法有坑,详细讲解请看我另一篇文章 “使用JSON.stringify进行深拷贝的坑” 以下是代码示例

let obj = {
	a:1,
	b:"基金亏太多,终有一天,你站上了天台,我卧上了轨道。来生我们有说有笑。"
}
//先转为json格式字符,再转回来
let newObj = JSON.parse(JSON.stringify(obj));
obj.a = 50;
console.log(newObj.a); //输出 1

普通的对象也可以进行深拷贝,但是!!! 当对象内容项为number,string.boolean的时候,是没有什么问题的。但是,如果对象内容项为undefined,null,Date,RegExp,function,error的时候。使用JSON.stringify()进行拷贝就会出问题了。 详细讲解请查看我的另一篇文章“使用JSON.stringify()进行深拷贝的坑”

第三种:使用第三方库lodash中的cloneDeep()方法

是否推荐使用,看情况吧。如果我们的项目中只需要一个深拷贝的功能,这种情况下为了一个功能引入整个第三方库就显得很不值得了。不如写一个递归函数对于项目来说性能更好。

lodash.cloneDeep()代码示例?

import lodash from 'lodash';
let obj = {
	a: {
	    c: 2,
	    d: [1, 3, 5],
	    e:'阿巴阿巴'
	  },
	  b: 4
}
const newObj = lodash.cloneDeep(obj);
obj.b = 20;
console.log(newObj.b); //输出 4; 不会改变

实际上,cloneDeep()方法底层使用的本来就是递归方法。只是在外层又封装了一层而已。

所以,如果不是原先项目中有使用 lodash 这个库的话,大可不必为了这一个功能而去引入它。

文章上方有提供进行深拷贝的函数,推荐使用。大家可自取。

第四种:JQuery的extend()方法进行深拷贝(推荐在JQ中使用)

这个方法仅适用于JQuery构建的项目。 JQuery自身携带的extend()方法可以进行深拷贝,不用自己写递归也不用引入第三方库还没什么坑。

在JQuery项目中的使用方式?

let obj = {
	a: {
	    c: 2,
	    d: [1, 3, 5],
	    e:'阿巴阿巴'
	  },
	  b: 4
}
let newObj= $.extend(true, {}, obj1);  //拷贝完成
obj.b = 20;
console.log(newObj.b); //输出 4

总结

进行深拷贝的方法

  • 递归函数 (推荐使用,项目中使用的更多,更小,更安全)
  • JSON.stringify() 和JSON.parse() ; (不推荐使用,如果遇到Function,Date等类型的变量容易出现一些意料之外的问题)
  • 第三方库lodash的cloneDeep()方法 (就情况而定,如果项目中原先就有lodash这个第三方库,可以使用,否则还是推荐使用递归函数。不然成本太高。)
  • JQuery的extend()函数 (推荐在JQuery项目中使用,其他项目依然推荐是用递归函数)

以上就是javascript进阶篇深拷贝实现的四种方式的详细内容,更多关于javascript深拷贝的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
JavaScript对象、属性、事件手册集合方便查询
Jul 04 Javascript
js调用AJAX时Get和post的乱码解决方法
Jun 04 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
Dec 17 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
微信小程序select下拉框实现效果
May 15 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 Javascript
js面向对象编程OOP及函数式编程FP区别
Jul 07 #Javascript
类和原型的设计模式之复制与委托差异
JS高级程序设计之class继承重点详解
Jul 07 #Javascript
JS class语法糖的深入剖析
Jul 07 #Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 #Javascript
js作用域及作用域链工作引擎
Promise静态四兄弟实现示例详解
Jul 07 #Javascript
You might like
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PDO::exec讲解
2019/01/28 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
centos7之Python3.74安装教程
2019/08/15 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
中国央视网签名寄语
2014/01/18 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
闭幕式主持词
2014/04/02 职场文书
大学学习计划书范文
2014/05/02 职场文书
文明工地标语
2014/06/16 职场文书
社区助残日活动总结
2014/08/29 职场文书
商业计划书范文
2019/04/24 职场文书