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 相关文章推荐
js以对象为索引的关联数组
Jul 04 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
jquery插件hiAlert实现网页对话框美化
May 03 Javascript
JavaScript 拖拽实例代码
Sep 21 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 Javascript
前端路由&webpack基础配置详解
Jun 10 Javascript
Node.js开发之套接字(socket)编程入门示例
Nov 05 Javascript
如何用Node.js编写内存效率高的应用程序
Apr 30 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调用三种数据库的方法(2)
2006/10/09 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
如何离线执行php任务
2017/02/21 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
django框架模板语言使用方法详解
2019/07/18 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
详解python变量与数据类型
2020/08/25 Python
Python self用法详解
2020/11/28 Python
网上蛋糕店创业计划书
2014/01/24 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
毕业实习评语
2014/02/10 职场文书
护士节活动总结
2014/08/29 职场文书
世界环境日活动总结
2015/02/11 职场文书