首页 > 其他分享 >如何实现深浅拷贝?(前端)

如何实现深浅拷贝?(前端)

时间:2023-08-10 19:07:30浏览次数:29  
标签:console log 前端 数据类型 深浅 obj 拷贝 age

概念深拷贝:将对象从内存中完整的拷贝一份出来,在堆中开辟一片新的区域存放新对象。 浅拷贝:创建一个新对象,这个对象有原始对象的一份精确拷贝,如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值;如果拷贝的是内存地址,拷贝的就是它的引用。

区别:深拷贝修改新对象不会影响原对象,它们之间互不影响;浅拷贝基本数据类型之间互不影响,引用数据类型其中一个改变了内存地址,就会影响另一个对象。

浅拷贝代码实现:

1.先看基本数据类型的浅拷贝

    // 数字类型 Number
    a = 1
    b = a
    b = 2
    console.log(a, b); //1,2

    // 字符串 String
    a = 'lmx'
    b = a
    b = 'oo'
    console.log(a, b); //lmx oo

    // 布尔值 Boolean
    a=false
    b=a
    b=true
    console.log(a,b); //false,true

    // 未定义 undefined
    a = undefined
    b = a
    b = false
    console.log(a, b) //undefined false

    // 空 Null
    a = null
    b = a
    b = undefined
    console.log(a, b) //null undefined

由此得知:基本数据类型之间互不影响

2.复杂数据类型的浅拷贝

  // 对象{}
    a={ name:'abc' }
    b=a
    b.name='def'
    console.log(a,b); // def,def 
    
    // 数组[]
    a = ['a', 'b', 'c', 'd', 'e', 'f']
    b = a
    b[1] = 'd'
    console.log(a, b);// ['a', 'd', 'c', 'd', 'e', 'f']
    
    // Object.assign() 实现
    let arr = [1, 2, 3, 4, 5, 6]
    let newArr = Object.assign([], arr)
    console.log(arr); // [1, 2, 3, 4, 5, 6]
    console.log(newArr); // [1, 2, 3, 4, 5, 6]
    
    // for in
     var obj = {
        name: '小猫',
        age: 2,
        hobby: {
            eat: 'fish',
            play: 'mouse'
        }
    }
    function cat(obj) {
        let newCat = {}
        // for in 遍历属性
        for (let key in obj) {
        // hasOwnProperty:判断属性是不是自己的 返回布尔值
            if (obj.hasOwnProperty(key)) {
                newCat[key] = obj[key]
            }
        }
        return newCat
    }
    let cats = cat(obj)
    console.log(cats); //{name: '小猫', age: 2, hobby: {eat: 'fish',play: 'mouse'}}


    // 扩展运算符
    let obj = {
        name: '哥哥~',
        hobby: {
            eat: 'rice',
            look: 'me'
        }
    }
    let newObj = {
        ...obj
    }
    Object.assign(obj, newObj)
    newObj.hobby.look = '天空'
    console.log(obj);
    console.log(newObj);

    // 当类型为function Date RegExp时 a保持不变
    // 函数 function
    a = function () {
        alert('aaa')
    }
    b = a
    b = function () {
        alert('bbb')
    }
    console.log(a.toString(), b.toString()); // function () {alert('aaa')} function (){alert('bbb')}

    // 日期 Date
    a = new Date('2022/10/4 00:00:00')
    b = a
    b = new Date('2002/12/05 00:00:00')
    console.log(a, b); // Tue Oct 04 2022 00:00:00 GMT+0800 (中国标准时间) Thu Dec 05 2002 00:00:00 GMT+0800 (中国标准时间)

    // 正则 RegExp
    a = new RegExp('abc')
    b = a
    b = new RegExp('aaa')
    console.log(a, b); // /abc/ /aaa/


由此得知:当这个对象的属性是引用类型时,修改其中一个对象,另一个对象也会跟着改变,这种拷贝就是浅拷贝

深拷贝代码实现:

为什么使用深拷贝?
就是希望在改变新数组/对象的时候不影响原数组/对象

1.基本数据类型的深拷贝

// 1.
    var a = 3
    var b = a
    b = 5
    console.log(a); // 3
    console.log(b); // 5

    // 2.
    var str='细狗'
    var str1=str
    str1='粗狗'
    console.log(str); // 细狗
    console.log(str1); // 粗狗

2.复杂数据类型的深拷贝

    // JSON.parse(JSON.stringify(arr)) 这个方法无法转化 function 和 undefined
    var arr = ['lmx', true, 0, [1, 2], { age: 18 }]
    var newArr = JSON.parse(JSON.stringify(arr))
    newArr[3][0] = 100
    console.log(arr); //['lmx', true, 0, [1,2], {age:18}]
    console.log(newArr); //['lmx', true, 0, [100,2], {age:18}]
    
    // Object.assign 对象中没有嵌套对象时,才可以实现深拷贝 
    const foo = {
      name: '张三',
      age: 24
    }
    const newFoo = Object.assign({}, foo)
    foo.age = 25
    console.log(foo, newFoo) // {name: '张三', age: 25} {name: '张三', age: 24}
   
   // structuredClone
   const foo = {
    name: '张三',
    info: {
        age: 24
        }
    }
    const newFoo = structuredClone(foo) // 
    foo.info.age = 25
    console.log(foo, newFoo) // { name: '张三', info: { age: 25 }} { name: '张三', info: { age: 24 }}

   // 扩展运算符
   let a = {
        x: 1,
        y: 2
    }
    let b = {
        ...a
    }
    b.y = 3
    console.log(a.y) // 2
    console.log(b.y);// 3
    
   // 递归
   function deepClone(obj) {
	// 数据类型为引用数据类型
	if (typeof obj === 'object') {
		// 初始化返回结果
		let result = Array.isArray(obj)? []: {};
		for (let key in obj) {
			// 避免相互引用出现死循环导致爆栈
			if (obj === obj[key]) {
				continue
			}
			if (obj.hasOwnProperty(key)) {
				// 递归调用
				result[key] = deepClone(obj[key])
			}
		}
		return result;
	 } else {
	 // 基本数据类型,直接返回
		return obj
	 }
   }

标签:console,log,前端,数据类型,深浅,obj,拷贝,age
From: https://blog.51cto.com/u_16222184/7038436

相关文章

  • 什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝
    什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝,如何使用什么是迭代器,生成器,装饰器#迭代器-迭代:一种不依赖于索引取值的方式,我们不需要关注它的位置,只要能够一个个取值,它就称之为迭代,python中就是for循环,内部调用对象.__next__()-可迭......
  • 基于 Webpack4 和 Vue 的可热插拔式微前端架构
    如果项目对你有所帮助,可以给个star Github地址什么是PuzzlePuzzle是基于Vue和Webpack4实现的一种项目结构;业务模块可以像拼图一样与架构模块组合,形成不同的系统,而这一切都是可以在生产环境热插拔的;这意味着你可以随时向你的系统添加新的功能模块,甚至改版整个系统,而不需......
  • 跳过前端网页无限debugger
    跳过网站循环debugger在debugger处打断点后点击浏览器禁用断点后刷新页面在debugger前行号处右键,选择一律不在此处暂停添加Addconditionalbreakpoint填写false替换文件参考文章......
  • 不务正业的前端写了一个自动化测试工具
    各位朋友大家好,大家应该都是被这么奇葩的标题吸引点击进来的吧,既然来了,那就跟我一起读下去吧,保证你这几分钟没有浪费(即使浪费了也能给你不一样的想法),废话不多说,大家坐稳,系好安全带,开始发车喽!!!......
  • 实践指南-前端性能提升 270%
    一、背景当我们疲于开发一个接一个的需求时,很容易忘记去关注网站的性能,到了某一个节点,猛地发现,随着越来越多代码的堆积,网站变得越来越慢。本文就是从这样的一个背景出发,着手优化网站的前端性能,并总结出一套开发习惯,让我们在日常开发时,也保持高性能,而不是又一次回过头来优化性能......
  • 聚焦Web前端安全:最新揭秘漏洞防御方法
    在Web安全中,服务端一直扮演着十分重要的角色。然而前端的问题也不容小觑,它也会导致信息泄露等诸如此类的问题。在这篇文章中,我们将向读者介绍如何防范Web前端中的各种漏洞。【万字长文,请先收藏再阅读】首先,我们需要了解安全防御产品已经为我们做了哪些工作。其次,我们将探讨前端......
  • abp-vnext-pro 实战(六,vue 前端状态pinia)
    在login的时候把所有写入全局store,console.log('----------------从数据库获取字典--------------------');constappStore=useAppStore();constdataDictionaryServiceProxy=newDataDictionaryServiceProxy();constdetailInput=new......
  • 外设移除区别/终端记录/重设密码/python测试/数据拷贝最大限度
    1.1【卸载】【弹出】【安全移除驱动器】区别【卸载】只是解除挂载(可以直接重新挂载)【弹出】弹出读卡器里面的存储卡(需要重新插入存储卡)【安全移除驱动器】断掉设备电源,移除设备(需要重新插入设备)1.2记录你的终端操作──script   (点击详细)如果过程不是很长,一屏以内的话一......
  • Web前端
      webcolor知识积累:颜色PSweb样式19类网站配色方案综合配色手册设计师谈网页配色其他色彩文档 标志设计 color辅助小工具:ColorKeyTakeColor网页流行色选取器  在线工具:等待画面生成器(国外)国外色彩查看工具QQ状在线态生成器色彩渐变代码生成器配色方案创建工具二配色方案......
  • 前端shp文件写到本地时,原生的shp-write存在的不能写入多条数据及中文乱码问题
    shp-write·Doraemon22333/前端-码云-开源中国(gitee.com)参考(1)https://github.com/hwbllmnn/shp-write/tree/maintenance(2)https://blog.csdn.net/qq_37748236/article/details/131804606......