JavaScript对象的拷贝

对象的介绍

对象是javaScript的数据类型。对象是一种复合值。他将很多值聚合在一起,可以通过名字访问这些值。对象可以看做对象的无序集合,每一个属性都是一个 名/值 对 ,属性名是字符串,因此我们可以看成字符串到值的映射。

对象不仅仅是字符串到值的映射,除了可以保持自有属性,javaScript对象还可以从一个成为原型的对象继承属性。对象的方法通常是继承的属性

js对象是动态的----可以新增删除属性

对象是可变的,我们通过引用来操作对象。如果一个变量x是指向一个对象的引用,那么执行代码let y=x;变量y也指向同一个对象引用。通过变量y修改这个对象也会对变量x造成影响

对象常用的用法是创建(create),设置(set), 查找(query),删除(delete).检测(test)和枚举(enumerate)它的属性。

属性包括名字和值,对象中不能存在两个同名的属性,属性名可以是任意字符串,值可以是任意js值,或者可以是一个getter或setter函数。除了名字和值之外,每个属性还有一些与之相关的值,成为‘属性特性’

数据的拷贝

数据拷贝,一般指栈堆中的栈拷贝。如果是基本数据,那么拷贝的就是数据;如果是复杂数据,那么拷贝的是指针,可能会导致多个指针指向同一个对象。

具体体现为,基本数据拷贝后,修改拷贝后的数据,不会被影响原数据;复杂数据拷贝后,修改拷贝后的数据,会作用到原数据,因为此时修改的是同一个指针指向的数据。

对象的浅拷贝

//1.直接赋值
let obj1 = {
        name: 'yrg',
        age: 22,
        hobby: ['basketball','game']
      }
      let obj2 = obj1
      obj1.name = 'xx'
      console.log(obj1,obj2)

   //2.Object.assign只复制一层对象的属性,如果对象中的属性值是对象,浅拷贝并不会复制对象属性中的属性
 let obj3 = {
        name: 'yrg',
        age: 22,
        person: {
          name: 'Henry',
          age: '21'
        },
        hobby: ['basketball','game']
      }
      let obj4 = Object.assign({},obj3 )
      obj3 .age = '99'; //不会改变obj4 的age
      obj4 .person.age = '25'; //也会改变obj3 的person.age
      console.log(obj3 ,obj34)

对象的深拷贝

方法一:.JSON.parse(JSON.stringify(obj1))
let obj1 = {
        name: 'yrg',
        age: 22,
        person: {
          name: 'Henry',
          age: 21,
        },
        hobby: ['basketball', 'game'],
      }
      let obj2 = JSON.parse(JSON.stringify(obj1))
      obj1.person.age = 99
      obj2.person.age = 199
      console.log(obj1,obj2)

方法二:迭代递归 对象 for…in
let obj1 = {
        name: 'yrg',
        age: 22,
        person: {
          name: 'Henry',
          age: 21,
        },
        hobby: ['basketball', 'game'],
      }
      function deepObject(obj) {
        let cloneObj = {}
        for (let key in obj) {
          let objChild = Object.prototype.toString.call(obj[key])
          cloneObj[key] =
            objChild === '[object Array]' || objChild === '[object Object]'
              ? deepObject(obj[key])
              : obj[key]
        }
        return cloneObj
      }
      let obj2 = deepObject(obj1)
      obj2.person.age = 999
      console.log(obj1, obj2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
拷贝和深拷贝是针对JavaScript对象属性对象的情况而言的。浅拷贝只是复制了对象的引用,也就是复制了内存地址,所以拷贝后的对象和原对象会共用同一个内存地址,属性的改变会相互影响。而深拷贝则是创建了一个完全独立的对象拷贝了所有的属性属性,所以拷贝后的对象和原对象是完全独立的,互不影响。 在JavaScript,可以通过不同的方法实现浅拷贝和深拷贝。浅拷贝可以使用手动实现、Object.assign()和拓展运算符等方法。手动实现的浅拷贝方法是遍历原始对象属性,将属性赋给新对象。Object.assign()方法可以将一个或多个源对象属性复制到目标对象,也可以用于实现浅拷贝。拓展运算符(...)也可以用于实现浅拷贝。 深拷贝则需要递归地复制对象属性属性。可以通过手动实现一个拷贝函数,在遍历原始对象属性时,如果属性对象类型,则递归调用深拷贝函数进行复制。这样可以创建一个完全独立的对象拷贝了所有的属性属性。 总结起来,浅拷贝只是复制了对象的引用,而深拷贝是创建了一个完全独立的对象。使用不同的方法可以实现浅拷贝和深拷贝,根据具体的需求选择合适的方法进行使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaScript拷贝和浅拷贝概念与用法实例分析](https://download.csdn.net/download/weixin_38735570/14820137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [javascript的深拷贝与浅拷贝](https://blog.csdn.net/weixin_47417033/article/details/124899204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小晨毅哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值