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 相关文章推荐
延时重复执行函数 lLoopRun.js
May 08 Javascript
语义化 H1 标签
Jan 14 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
Sep 09 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
javascript函数特点实例分析
May 14 Javascript
Jquery简单实现GridView行高亮的方法
Jun 15 Javascript
jQuery删除节点用法示例(remove方法)
Sep 08 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 Javascript
Nest.js环境变量配置与序列化详解
Feb 21 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
golang与PHP输出excel示例
2016/07/22 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
js微信支付实现代码
2016/12/22 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
使用Django连接Mysql数据库步骤
2019/01/15 Python
在Python中COM口的调用方法
2019/07/03 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
健康教育评估方案
2014/05/25 职场文书
升职自荐信怎么写
2015/03/05 职场文书
员工家属慰问信
2015/03/24 职场文书
python tkinter模块的简单使用
2021/04/07 Python
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis