记录-实现深拷贝的四种方式

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录-实现深拷贝的四种方式

概念介绍

深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象 浅拷贝:不在堆内存中重新开辟空间,只复制栈内存中的引用地址。本质上两个对象(数组)依然指向同一块存储空间

第一种:递归方式(推荐,项目中最安全最常用)

使用递归的方式进行对象(数组)的深拷贝

奉上已封装的深拷贝函数?

	//函数拷贝
    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项目中使用,其他项目依然推荐是用递归函数)

本文转载于:

https://juejin.cn/post/7109843641677398053

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录-实现深拷贝的四种方式

原文链接:https://www.cnblogs.com/smileZAZ/p/17340926.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:记录-实现深拷贝的四种方式 - Python技术站

(0)
上一篇 2023年4月20日
下一篇 2023年4月22日

相关文章

  • JavaScript内置对象math,global功能与用法实例分析

    JavaScript内置对象math,global功能与用法实例分析 JavaScript是一种非常强大的编程语言,在其标准库中导入了许多内置对象,如Math和global,它们都拥有经过测试和优化过的功能,可以使得JavaScript程序变得更加高效和灵活。接下来我将详细讲解这两个内置对象的功能与用法,并且提供两条示例以便加深读者的理解。 Math对象 M…

    JavaScript 2023年5月27日
    00
  • JavaScript中判断为整数的多种方式及保留两位小数的方法

    JavaScript中判断为整数的多种方式及保留两位小数的方法 判断为整数的多种方式 在JavaScript中,判断一个数是否为整数是经常需要用到的操作。下面列出了常见的几种方法: 取模运算 利用数学中取模运算的特性,即整数x对于任意不等于0的正整数y,x%y的结果只可能是0到y-1之间的整数,如果x % 1等于0,则说明它为整数。具体代码如下: funct…

    JavaScript 2023年6月10日
    00
  • 正则表达式搭配js轻松处理json文本方便而老古

    正则表达式搭配JS轻松处理JSON文本方便而老古 什么是正则表达式? 正则表达式是一种用于描述字符串模式的语法,通过使用简洁而强大的语法规则,可以在文本匹配、搜索、替换、验证等方面提供非常高效和灵活的处理方式。 如何在JavaScript中使用正则表达式处理JSON文本? JSON(JavaScript Object Notation)是一种轻量级的数据交换…

    JavaScript 2023年5月27日
    00
  • js传值后台中文出现乱码的解决方法

    下面是详细讲解“js传值后台中文出现乱码的解决方法”的完整攻略: 问题描述 在前端页面使用 JavaScript 传递参数给后台时,中文参数会出现乱码! 根本原因 乱码的出现是因为前端传递参数时,使用了不同的字符集编码。而后台在解析字符时使用的编码集与前端传递的不同,就导致中文字符的解析出现了不一致的问题。 解决方法 下面介绍两条解决办法: 方法一:转码传递…

    JavaScript 2023年5月19日
    00
  • 理解Javascript_03_javascript全局观

    理解Javascript_03_javascript全局观的完整攻略包括以下几个方面: 1. 全局作用域 JavaScript中的全局作用域是指在当前页面所有函数和变量都能访问的范围。当页面被加载时,全局作用域就已经存在,并且在页面生命周期的整个过程中都存在。在全局作用域中定义的变量和函数都是在全局范围内可见的。 2. 全局变量 在全局作用域中声明的变量是全…

    JavaScript 2023年6月10日
    00
  • 仿ElementUI实现一个Form表单的实现代码

    下面我将为你详细讲解“仿ElementUI实现一个Form表单的实现代码”的完整攻略。 前言 ElementUI是很多前端项目所采用的UI框架,其中使用最频繁的就是Form表单。通过学习ElementUI的Form表单,可以更好地了解前端UI框架的实现方式。因此,我们可以尝试自己实现一个仿ElementUI的Form表单。 实现步骤 1. 创建表单组件 首先…

    JavaScript 2023年6月10日
    00
  • JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结

    为了解决JavaScript在IE和Firefox(火狐)的不兼容问题,我们需要掌握以下知识点: 1. DOM(文档对象模型)的差异 IE和Firefox对DOM标准的解析有所不同,导致同样的JavaScript代码在不同浏览器中执行效果会有所不同。我们可以采用以下方法解决这个问题: (1)使用ID来获取元素 在IE中,我们可以通过document.all[…

    JavaScript 2023年5月18日
    00
  • js字符串转换成数字与数字转换成字符串的实现方法

    JS 字符串转换成数字和数字转换成字符串分别涉及到 JS 数据类型的转换。下面,我们分别详细讲解这两种数据类型间的转换实现方法: JS 字符串转换成数字 JS 字符串转换成数字主要用到以下两个函数: 1. parseInt(string, radix) 这个函数将给定的字符串参数转换成整数类型,并返回其整数值。 string:需要被转换成整数的字符串 rad…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部