js学习第十四天

浅拷贝

浅拷贝:拷贝的对象和源对象相互有影响

 浅拷贝方式一: Object.assign(目标对象,源对象)

const obj = { name: 'longge', age: 16, arr: [] }
      const newObj = {}
     
      Object.assign(newObj, obj)
      console.log(newObj)
      obj.age = 17
      obj.arr.push(1)
      console.log(newObj, obj) 

 浅拷贝方式二: 展开运算符

const obj = { name: 'longge', age: 16, arr: [] }
 const newObj = { ...obj }
      console.log(newObj)
      newObj.arr.push(10)
      console.log(obj)
      const arr = [1, 2, 3, { a: 1 }]
      const newArr = [...arr]
      console.log(newArr)
      newArr[3].a = 100
      console.log(arr) 

 浅拷贝方式三: concat / slice 

 const arr = [1, 2, 3, { a: 1 }]
       const newArr = [].concat(arr)
       console.log(newArr)
       newArr[3].a = 100
       console.log(arr)
const arr = [1, 2, 3, { a: 1 }]
     
      const newArr = arr.slice()
      console.log(newArr)
      newArr[3].a = 100
      console.log(arr)

 深拷贝

拷贝的对象和源对象没有影响

深拷贝 1 :JSON.stringify 与 JSON.parse

缺点 忽略函数、属性值为undefined的属性

const obj = {
        name: 'longge',
        age: 16,
        arr: [],
        o: { a: 1, b: 2 },
        // f: function () {},
        c: undefined,
        d: new Date(),
      }
      obj.o1 = obj weakMap
      // 深拷贝 1 JSON.stringify 与 JSON.parse
      //        缺点 忽略函数、属性值为undefined的属性
       const newObj = JSON.parse(JSON.stringify(obj))
      console.log(newObj)
      obj.arr.push(100)
      console.log(obj, newObj) 

深拷贝 2 利用第三方库Lodash(提供很多工具方便开发) 

const obj = {
        name: 'longge',
        age: 16,
        arr: [],
        o: { a: 1, b: 2 },
        // f: function () {},
        c: undefined,
        d: new Date(),
      }
 console.log(_)
      const newObj = _.cloneDeep(obj)
      console.log(newObj) 

深拷贝 3 自己实现 递归

 const obj = {
        name: 'longge',
        age: 16,
        arr: [],
        o: { a: 1, b: 2 },
        // f: function () {},
        c: undefined,
        d: new Date(),
      }
function deepClone(obj) {
        if (obj == null) return obj
        if (obj instanceof Date) return new Date(obj)
        if (typeof obj !== 'object') return obj
        // obj 是对象或数组
        const newObj = new obj.constructor()
        for (let k in obj) {
          newObj[k] = deepClone(obj[k])
        }
        return newObj
      }
      const o = { a: 1, b: 2, c: { m: 20 } }
      const newObj = deepClone(obj)
      // newObj.c.m = 30
      console.log(newObj)
      // console.log(o)

递归 

函数自己调用自己

举例:

 求 1 2 3 5 8 13 21 34 55 89 ... 的第10个数是多少?

<script>
      
      function getNum(n) {
        if (n === 2) return 2
        if (n === 1) return 1
        return getNum(n - 1) + getNum(n - 2)
      }

      console.log(getNum(10))
      /*
        getNum(5)  getNum(4)+ getNum(3) 5 +  3
        getNum(4)  getNum(3)+ getNum(2)  3  + 2
        getNum(3)  getNum(2)+ getNum(1) = 2 +1
      */
    </script>

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值