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面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
extjs 初始化checkboxgroup值的代码
Sep 21 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
jquery中object对象循环遍历的方法
Dec 18 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
Sep 05 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
Jan 27 Javascript
值得收藏的vuejs安装教程
Nov 21 Javascript
js利用拖放实现添加删除
Aug 27 Javascript
微信小程序实现音乐播放页面布局
Dec 11 Javascript
Vue仿百度搜索功能
Dec 28 Vue.js
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 session 错误
2009/05/21 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
JavaScript DOM基础
2015/04/13 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
javascript中UMD规范的代码推演
2018/08/29 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
期末考试复习计划
2015/01/19 职场文书
董事长年会致辞
2015/07/29 职场文书
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js