Javascript学习(十二) --JS进阶(深浅拷贝,异常处理,处理this,性能优化,综合案例)

linbojue
• 阅读 0

目录

一. 深浅拷贝 ​编辑

  1. 浅拷贝
  2. 深拷贝
  3. 通过递归实现深拷贝
  4. lodash/cloneDeep
  5. 通过JSON.stringify()实现 二. 异常处理
  6. throw抛异常
  7. try/catch 捕获异常
  8. debugger 三. 处理this
  9. this指向 (1)普通函数this指向 (2)箭头函数this指向
  10. 改变this (1)call() –了解 (2)apply() (3)bind() 四. 性能优化
  11. 防抖
  12. 节流
  13. Lodash 库 实现节流和防抖 五. 综合案例 一. 深浅拷贝 开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题:
  1. 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝:拷贝的是地址 常见方法:

  2. 拷贝对象:Object.assgin() / 展开运算符 {...obj} 拷贝对象 const obj = { uname: 'pink', age: 18, family: {

     baby: '小pink'

    } } // 浅拷贝 const o = { ...obj } console.log(o) o.age = 20 console.log(o) console.log(obj) const o = {} Object.assign(o, obj) o.age = 20 o.family.baby = '老pink' console.log(o) console.log(obj) AI写代码 javascript 运行

  3. 拷贝数组:Array.prototype.concat() 或者 [...arr]

  4. 直接赋值和浅拷贝有什么区别? 直接赋值的方法,只要是对象,都会相互影响,因为是直接拷贝对象栈里面的地址 浅拷贝如果是一层对象,不相互影响,如果出现多层对象拷贝还会相互影响

  5. 浅拷贝怎么理解? 拷贝对象之后,里面的属性值是简单数据类型直接拷贝值 如果属性值是引用数据类型则拷贝的是地址

  6. 深拷贝

  7. 通过递归实现深拷贝 函数递归: 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数 简单理解:函数内部自己调用自己, 这个函数就是递归函数 递归函数的作用和循环效果类似 由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

利用递归函数实现 setTimeout 模拟 setInterval效果: ①:页面每隔一秒输出当前的时间 ②:输出当前时间可以使用:new Date().toLocaleString() function getTime() { document.querySelector('div').innerHTML = new Date().toLocaleString() setTimeout(getTime, 1000) } getTime() AI写代码 javascript 运行 递归实现深拷贝:

const obj = {
  uname: 'pink',
  age: 18,
  hobby: ['乒乓球', '足球'],
  family: {
    baby: '小pink'
  }
}
const o = {}
// 拷贝函数
function deepCopy(newObj, oldObj) {
  debugger
  for (let k in oldObj) {
    // 处理数组的问题  一定先写数组 在写 对象 不能颠倒
    if (oldObj[k] instanceof Array) {
      newObj[k] = []
      //  newObj[k] 接收 []  hobby
      //  oldObj[k]   ['乒乓球', '足球']
      deepCopy(newObj[k], oldObj[k])
    } else if (oldObj[k] instanceof Object) {
      newObj[k] = {}
      deepCopy(newObj[k], oldObj[k])
    }
    else {
      //  k  属性名 uname age    oldObj[k]  属性值  18
      // newObj[k]  === o.uname  给新对象添加属性
      newObj[k] = oldObj[k]
    }
  }
}
deepCopy(o, obj) // 函数调用  两个参数 o 新对象  obj 旧对象
console.log(o)
o.age = 20
o.hobby[0] = '篮球'
o.family.baby = '老pink'
console.log(obj)
console.log([1, 23] instanceof Object)

AI写代码 javascript 运行

  1. lodash/cloneDeep js库lodash里面cloneDeep内部实现了深拷贝