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 相关文章推荐
索趣科技的答案
Feb 07 Javascript
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
jquery $(this).attr $(this).val方法使用介绍
Oct 08 Javascript
jquery删除指定子元素代码实例
Jan 13 Javascript
angular2使用简单介绍
Mar 01 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 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之sprintf函数用法详解
2014/11/12 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
jquery实现div阴影效果示例代码
2013/09/16 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
2015年班组长工作总结
2015/04/10 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
python区块链持久化和命令行接口实现简版
2022/05/25 Python
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript