目录
深浅拷贝
浅拷贝
深拷贝
递归实现深拷贝
js库lodash里面cloneDeep内部实现了深拷贝
JSON序列化
异常处理
throw 抛异常
try /catch 捕获异常
debugg
处理this
this指向
普通函数
箭头函数
改变this
call()
apply()
bind()
call apply bind 总结
性能优化
防抖
节流
首先浅拷贝和深拷贝只针对引用类型
浅拷贝:拷贝的是地址
常见方法:
如果是简单数据类型拷贝值,引用数据类型拷贝的是地址 (简单理解: 如果是单层对象,没问题,如果有多层就有问题)
首先浅拷贝和深拷贝只针对引用类型
深拷贝:拷贝的是对象,不是地址
常见方法:
怎么实现深拷贝?
函数递归:
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
再调用
const o = _.cloneDeep(obj)
异常处理是指预估代码执行过程中可能发生的错误,然后最大程度的避免错误的发生导致整个程序无法继续运行
总结:
总结:
try...catch
用于捕获错误信息try
代码段中try
代码段中出现错误后,会执行 catch
代码段,并截获到错误信息相当于断点调试
普通函数的调用方式决定了 this
的值,即【谁调用 this
的值指向谁】
注: 普通函数没有明确调用者时 this
值为 window
,严格模式下没有调用者时 this
的值为 undefined
箭头函数中的 this
与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在 this
!箭头函数中访问的 this
不过是箭头函数所在作用域的 this
变量。
使用 call 方法调用函数,同时指定被调用函数中 this 的值
语法:fun.call(thisArg, arg1, arg2, ...)
总结:
call
方法能够在调用函数的同时指定 this
的值call
方法调用函数时,第1个参数为 this
指定的值call
方法的其余参数会依次自动传入函数做为函数的参数使用 apply 方法调用函数,同时指定被调用函数中 this 的值
apply
方法能够在调用函数的同时指定 this
的值apply
方法调用函数时,第1个参数为 this
指定的值apply
方法第2个参数为数组,数组的单元值依次自动传入函数做为函数的参数bind
方法并不会调用函数,而是创建一个指定了 this
值的新函数
注:bind
方法创建新的函数,与原函数的唯一的变化是改变了 this
的值。
防抖函数怎么实现: 核心就是利用setTimeout定时器来实现
1、声明定时器变量
2、每次触发时间都要判断是否有定时器 如果有就先清除以前的定时器
3、如果没有定时器 则开启定时器 存到定时器变量里面
4、定时器里面写函数调用
const box = document.querySelector('.box')
let i = 1 // 让这个变量++
// 鼠标移动函数
function mouseMove() {
box.innerHTML = ++i
// 如果里面存在大量操作 dom 的情况,可能会卡顿
}
// console.log(mouseMove)
// 节流函数 throttle
function throttle(fn, t) {
// 起始时间
let startTime = 0
return function () {
// 得到当前的时间
let now = Date.now()
// 判断如果大于等于 500 采取调用函数
if (now - startTime >= t) {
// 调用函数
fn()
// 起始的时间 = 现在的时间 写在调用函数的下面
startTime = now
}
}
}
box.addEventListener('mousemove', throttle(mouseMove, 500))