首页 > 其他分享 >聊一聊深拷贝和浅拷贝

聊一聊深拷贝和浅拷贝

时间:2023-05-19 15:38:57浏览次数:23  
标签:---- console log --- 聊一聊 let 拷贝


在了解深浅拷贝之前,我们需得对堆栈、基本数据类型、引用数据类型有基本的了解

基本数据类型:number、string、boolean、null、undefined
引用数据类型:object、function、array

栈内存是保存大小固定的数据,即保存基本数据类型。堆保存的大小不固定,可保存引用数据

浅拷贝:拷贝基本数据类型时,不受任何影响,当拷贝引用类型时,源对象也会被修改。
深拷贝:深拷贝就是完完全全拷贝一份新的对象,它会在内存的堆区域重新开辟空间,修改拷贝对象就不会影响到源对象
即深浅拷贝是针对于引用数据类型。

实现深拷贝的四种方式:

  1. ES6扩展运算符(…)
let a = {
  name : '张三',
  age : '18'
}

let b = {...a};

a.name = '李四';

console.log(a,'----a---')   

console.log(b,'----b---')

聊一聊深拷贝和浅拷贝_基本数据类型

let a = {
   name : '张三',
   age : '18',
   hobby:{
     one:'running',
     two:'swimming',
   }
 }

 let b = {...a};

 a.hobby.one = 'cycling';

 console.log(a,'----a---')   

 console.log(b,'----b---')

聊一聊深拷贝和浅拷贝_js_02

注意:es6的展开语法只针对第一层,对多层还是浅拷贝方式

  1. Object.assign()
let a = {
  name : '张三',
  age : '18'
}

let b = Object.assign({},a);

a.name = '李四';

console.log(a,'----a---')   

console.log(b,'----b---')

聊一聊深拷贝和浅拷贝_JSON_03

let a = {
   name : '张三',
   age : '18',
   hobby:{
     one:'running',
     two:'swimming',
   }
 }

 let b = Object.assign({},a);

 a.hobby.one = 'cycling';

 console.log(a,'----a---')   

 console.log(b,'----b---')

聊一聊深拷贝和浅拷贝_基本数据类型_04

注意:Object.assign()只针对第一层,对多层还是浅拷贝方式

  1. JSON.parse(JSON.stringify(待拷贝对象))
    但此拷贝的缺点,即没法拷贝内部函数
let a = {
   name : '张三',
   age : '18',
   like(){
     console.log('喜欢唱歌、滑冰');
   }
 }

 let b = JSON.parse(JSON.stringify(a));

 console.log(a,'----a---')   

 console.log(b,'----b---')

聊一聊深拷贝和浅拷贝_js_05


在b对象中未出现like函数


标签:----,console,log,---,聊一聊,let,拷贝
From: https://blog.51cto.com/u_16120408/6312725

相关文章

  • 前端换肤,聊一聊主题切换那些事
    一些网站通常会提供白天、夜间模式,以及自定义主题等等,这种主题切换也就是本文说的前端换肤。这次案例用的是白天和夜间模式的切换,在做换肤之前,得先知道一件事情:css的变量定义,对变量定义不熟悉的同学请看MDN文档:自定义属性(--*):CSS变量主题切换也就是样式的切换,白天和黑夜的模式切......
  • 聊一聊适配器模式
    接口不能用?行,我帮你适配一、概述适配器模式(Adapter),是23种设计模式中的结构型模式之一;它就像我们电脑上接口不够时,需要用到的拓展坞,起到转接的作用。它可以将新的功能和原先的功能连接起来,使由于需求变动导致不能用的功能,重新利用起来。上图的Mac上,只有两个typec接口,当我们需......
  • js深拷贝
    js深拷贝在JavaScript中,有多种方法可以实现对象的深拷贝,下面介绍几种常用的方式:手动遍历对象进行复制functiondeepCopy(obj){if(typeofobj!=='object'||obj===null){returnobj;}letnewObj=Array.isArray(obj)?[]:{};for(letkeyin......
  • Java实现文件拷贝的4种方法.
    第一种方法:古老的方式publicstaticlongforJava(Filef1,Filef2)throwsException{longtime=newDate().getTime();intlength=2097152;FileInputStreamin=newFileInputStream(f1);FileOutputStreamout=newFileOutputStream(f2);byte[]buffer=newbyte......
  • 聊一聊模板方法模式
    统一抽取,制定规范;一、概述模板方法模式,又叫模板模式,属于23种设计模式中的行为型模式。在抽象类中公开定义了执行的方法,子类可以按需重写其方法,但是要以抽象类中定义的方式调用方法。总结起来就是:定义一个操作的算法结构,而将一些步骤延迟到子类中。在不改变算法结构的情况下,子......
  • C++禁止函数拷贝和移动
    #defineDISALLOW_COPY(ClassName)\ClassName(constClassName&)=delete;\ClassName&operator=(constClassName&)=delete#defineDISALLOW_MOVE(ClassName)\ClassName(ClassName&&)=delete;\ClassName&operator=......
  • java的深拷贝和浅拷贝
    Java将内存空间分为堆和栈。基本类型直接在栈中存储数值,而引用类型是将引用放在栈中,实际存储的值是放在堆中,通过栈中的引用指向堆中存放的数据。转载:https://juejin.cn/post/6977210221542408199#comment......
  • 聊一聊最近高速发展的ChatGPT
     随着人工智能技术的不断发展和普及,ChatGPT作为聊天机器人的代表之一也在不断发展和壮大。未来,ChatGPT将有以下几个方面的发展趋势:语义理解和智能对话的提升:ChatGPT将会不断提高语义理解和智能对话的能力,通过学习用户的习惯和使用方式,逐步提高机器人的智能水平,使其成为一名......
  • 聊一聊redis十种数据类型及底层原理
    概述Redis是一个开源的高性能键值数据库,它支持多种数据类型,可以满足不同的业务需求。本文将介绍Redis的10种数据类型,分别是string(字符串)hash(哈希)list(列表)set(集合)zset(有序集合)stream(流)geospatial(地理)bitmap(位图)bitfield(位域)hyperloglog(基数统计)String概述string......
  • 聊一聊 dotnet-trace 调查 lock锁竞争
    一:背景1.讲故事最近在分析一个linux上的dump,最后的诱因是大量的lock锁诱发的高频上下文切换,虽然问题告一段落,但我还想知道一点信息,所谓的高频到底有多高频?锁竞争到底是一个怎样的锁竞争?如果了解这些信息对我们后续分析此类问题非常有帮助。要想获取此类信息,看dump肯定是......