首页 > 其他分享 >实现深拷贝的几种方式

实现深拷贝的几种方式

时间:2023-04-24 14:24:31浏览次数:26  
标签:obj log 方式 newObj let console 拷贝 几种

深拷贝:在堆内存中开辟一个存储空间来存储一个一模一样的克隆对象。
浅拷贝:相反不在堆内存中重新开辟空间,仅仅复制栈内存中的引用地址,本质上依然指向的同一块存储空间。
在我们的项目日常开发中,经常使用到深拷贝和浅拷贝,今天就跟大家分享几种深拷贝的实现方式:
一、JSON.stringify();(深拷贝普通对象时推荐使用)

let obj = {
  name: '张三',
  age: 18
}
 
// 先转为json格式字符串,再转回来
let newObj = JSON.parse(JSON.stringify(obj));
 
obj.age = 20;
console.log(newObj.age); // 输出18

当对象属性类型为string、number、boolean时,推荐使用该方式。但是属性类型为undefined、null、Date、RegExp、function时,使用该方式进行深拷贝会出问题。

二、递归方式(推荐使用)

// 函数拷贝
const copyObj = (obj = {}) => {
    let newObj = null
    // 判断是否需要继续进行递归
    if(typeof obj == 'object' && obj !== null){
        newObj = obj instanceof Array?[]:{}
        // 进行下一层递归克隆
        for(let i in obj){
            newObj[i] = copyObj(obj[i])
        }
    }else{
        newObj = obj
    }
    return newObj
}

let obj = {
    numberParams: 1,
    funcParams:() => {
        console.log('I am a function!')
    },
    objParams: {
        prop1: 1,
        prop2: 2
    }
}

const newObj = copyObj(obj)
obj.numberParams = 100 // 更改原对象的属性
console.log(newObj.numberParams) // 输出1

这种方式为项目中最安全且最常用的深拷贝方法。

三、第三方库lodash的cloneDeep()方法

这种方式是否使用,取决于我们项目中是否已使用过lodash其它功能,没必要为了一个深拷贝功能而引入一整个库。

import lodash from 'lodash'
let obj = {
    person: {
        name: '张三',
        age: 18,
        hobbies: ['跑步','乒乓球','爬山']
    },
    p: 1
}
const newObj = lodash.cloneDeep(obj)
obj.p = 20
console.log(newObj.p) // 输出1

四、JQuery的extend()方法(推荐在JQ中使用)

如果项目中使用了JQ,那么可以使用JQ的extend()实现深拷贝。

let obj = {
    person: {
        name: '张三',
        age: 18,
        hobbies: ['跑步','乒乓球','爬山']
    },
    p: 1
}
const newObj = $.extend(true,{},obj)
obj.p = 20
console.log(newObj.p) // 输出1

标签:obj,log,方式,newObj,let,console,拷贝,几种
From: https://www.cnblogs.com/coolsboy/p/17349351.html

相关文章

  • BeanUtils.copyProperties()深拷贝失效,对象值被引用改变
    之前就想一个深拷贝的解决方案,尝试用BeanUtils.copyProperties实现现在发现无法实现,两个变量引用位置相同最好自己实现一个工具类。之前在脉脉上看到有人提问,回答是用fastjson序列化解决的 Studentclone=JSONObject.parseObject(JSONObject.toJSONBytes(student),Stude......
  • css 渲染优化的方式
    1、加载性能优化:css压缩、css单一样式、减少使用@import,而建议使用link;2、 选择器性能优化:避免使用通配规则*尽量少的去对标签进行选择,而是用class不要去用标签限定ID或者类选择符:ul#nav,应该简化为#nav尽量少的去使用后代选择器,降低选择器的权重值考虑继承3、渲染......
  • 浮点数规格化的目的,方式,和形式
        ......
  • 防抖和节流及多种实现方式
    当用户在网页中进行操作时,如点击、滚动、输入等,往往会频繁地触发事件。如果每个事件都立即执行相应的函数,可能会导致性能问题和用户体验不佳,因为这些函数可能需要执行复杂的操作,如计算、网络请求等。为了优化这种情况,我们可以使用防抖和节流来限制函数的调用次数,从而提高性能和用......
  • NPM 实用命令与快捷方式
    在JavaScript中,无论是新手还是专家都可能在命令行中使用过NPM。在本篇文章中,我将会整理超实用的NPM命令、快捷方式及技巧,帮助JavaScript开发人员提高生产力和效率。 在这篇文章中,我们将涵盖以下主题:npm的定义。使用npm包管理系统管理应用程序依赖项,来发布或取消发......
  • UUID与Python线程同步方式
    UUID是如何保证唯一性高可靠,32位16进制数,32*4=128位二进制数,UUID4重复概率1/(2^128),加上时间戳应该好点,UUID1好点。UUIDVersion1:基于时间的UUID时间戳、随机数和机器MAC地址得到。常用UUIDVersion2:DCE安全的UUIDUUID1的时间戳前4位置换为POSIX的UID或GIDUUIDVersion3:......
  • go模拟三元表达式最简单的方式
    众所周知,Go语言本身并没有提供内置的三元表达式,但是我们可以使用一些技巧来模拟实现。下面是使用最短的代码实现Go的三元表达式:packagemainimport"fmt"funcmain(){x:=10y:=20max:=map[bool]int{true:x,false:y}[x>y]fmt.Println(max)}......
  • 手动拷贝文件至nextcloud中并扫描(docker)
    出于不能在nextcloud的web页面手动上传,需要写脚本实现自动上传文件至nextcloud的目的,直接在服务器上将文件手动拷贝到nextcloud目录:dockercp/data/filesnextcloud:/var/www/html/data/账号名/files但是一般人不这么做,一般挂载到-v卷岂不更好在nextcloud目录中我们可以这么扫......
  • 王道408操作系统-IO控制方式
    IO控制方式/输入输出控制方式即:用什么样的方式来控制IO设备的数据读写,外围设备和内存之间的IO控制方式有4种1.程序直接控制方式2.中断驱动方式3.DMA方式(直接存储器存取方式)4.通道控制方式......
  • redis应用场景及三种集群方式
    1.正文1.redis应用场景2.redis得持久化方式3.redis得集群4.java连接redis服务器2.redis应用场景1、热点数据的缓存----由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这......