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 相关文章推荐
农历与西历对照
Sep 06 Javascript
分享一个asp.net pager分页控件
Jan 04 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
Jun 02 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
微信小程序 数据绑定详解及实例
Oct 25 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
基于Proxy的小程序状态管理实现
Jun 14 Javascript
微信小程序云函数使用mysql数据库过程详解
Aug 07 Javascript
jquery实现的分页显示功能示例
Aug 23 jQuery
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中计算字符串相似度的函数代码
2012/12/29 PHP
深入解析php之apc
2013/05/15 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
php实现的短网址算法分享
2014/06/20 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
javascript定时器完整实例
2015/02/10 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
Python守护进程(daemon)代码实例
2015/03/06 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python实现图片识别加翻译功能
2019/12/26 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
上班上网检讨书
2014/01/29 职场文书
高级工程师英文求职信
2014/03/19 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
中职生求职信
2014/07/01 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
党员发展大会主持词
2015/07/03 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
索尼ICF-36收音机评测
2022/04/30 无线电
springboot实现string转json json里面带数组
2022/06/16 Java/Android