对象的浅克隆和深克隆

       浅克隆分两步:
       1. 做一个空的对象
       2. 把旧对象进行遍历, 把其中的属性和值 挨个放到新对象里

注意事项:

         浅克隆 只适合 对象的属性是 基础类型的场景
         如果
对象的属性 也是个对象类型, 需要用递归方式来实现深克隆

代码如下

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 浅克隆 只适合 对象的属性是 基础类型的场景
      // 如果对象的属性 也是个对象类型, 需要用递归方式来实现深克隆
      let obj1 = {
        uname: 'tc',
        age: 18,
        colors: ['orange', 'green'],
        friend: { uname: '冯昕吃荷兰猪' },
      }

      //   let obj2 = obj1 //内存中的对象被两个变量名指向了
      //   obj2.uname = 'ljr' //此时a.uname也变成了ljr,所以无法实现浅克隆
      //   console.log(obj1)

      //   使用对象遍历的方法来实现浅克隆
      var obj3 = {}
      for (let key in obj1) {
        obj3[key] = obj1[key]
      }
      obj3.uname = 'bb'
      console.log(obj1) //此时a.uname的值没有被修改
      obj3.friend.uname = '荷兰猪'
      console.log(obj3) //此时发现obj.friend.uname值被修改了!

      //深克隆
      function deepClone(obj = {}) {
        if (typeof obj !== 'object' || obj == null) {
          return obj
        }
        let result
        if (obj instanceof Array) {
          result = []
        } else {
          result = {}
        }
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            result[key] = deepClone(obj[key])
          }
        }
        return result
      }
      let obj4 = deepClone(obj1)
      obj4.uname = '树下'
      obj4.friend.uname = '李白'
      //修改以后 obj4修改自身属性(包括属性是引用类型)都不会影响obj1
    </script>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多看书少吃饭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值