1,防抖节流函数
1,什么是防抖和节流函数?
防抖:调用函数后,事件执行会有一段时间的间隔才可以再次调用事件,
简单来说就是在固定的时间内调用事件,每隔N秒调用一次,
节流:在固定时间内调用事件不限次数,但是只执行一次,
简: 固定时间内事件执行一次,(N秒内调用一次事件)
2,防抖和节流的应用场景,
按钮多次触发接口调用,可以使用防抖函数进行限制,
类似瀑布流,和过多数据表格进行展示时,可以使用节流函数优化使用体验
3,常见的防抖函数和节流函数使用
//防抖函数 --- 定时器---
function debounce(func,wait) {
let timer=null;
return function() {
//保存当前调用的dom对象
let that=this;
//保存事件对象
let args=arguments;
clearTimeout(timer)
timer=setTimeout(function() {
func.apply(that,args)
},wait)
}
}
//节流函数 ---时间戳--
function throttle(func,wait) {
//定义初始时间
let oldTime=0;
return function() {
let _this=this;
let args=arguments;
//当前时间戳
let newTime=+new Date();
//判断用当前时间减去旧的时间,如果大于wait指定的时间就会触发
if(newTime-oldTime>wait) {
//执行触发的函数
func.apply(_this,args)
//将旧时间更新
oldTime=newTime;
}
}
}
//节流 ---定时器---
function throttle(func,wait) {
let timer=null;
return function() {
let _this=this;
let args=arguments;
if(!timer) {
timer=setTimeout(function() {
timer=null;
func.apply(_this,args)
},wait)
}
}
}
二,**Set、Map、WeakSet和WeakMap的区别**
1. **Set**
Set是ES6提供的一种新的数据结构,它类似于数组,但成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成Set数据结构。它有以下常用方法:
* `size()`:返回Set结构的成员总数。
* `add(value)`:添加某个值,返回Set结构本身。
* `delete(value)`:删除某个值,返回一个布尔值,表示删除是否成功。
* `has(value)`:返回一个布尔值,表示该值是否为Set的成员。
* `clear()`:清除所有成员,没有返回值。
2. **Map**
Map也是一种键值对的数据结构,但它与Object最大的区别是键的类型不限制为字符串,可以是任意类型(包括函数、对象或基本类型)。Map的键名是唯一的,不会覆盖。Map有以下常用方法:
* `size`:返回Map对象的键/值对的数量。
* `set(key, value)`:设置键的值,并返回这个Map对象。如果键已经存在则更新该键对应的值。
* `get(key)`:返回键对应的值,如果键不存在则返回undefined。
* `has(key)`:返回一个布尔值,表示Map对象中是否含有指定的键。
* `delete(key)`:删除Map对象中的某个键,并返回一个布尔值表示是否删除成功。
* `clear()`:清除Map对象中的所有键值对。
3. **WeakSet**
WeakSet是ES6提供的一种新的数据结构,表示对象的弱集合。WeakSet的成员只能是对象,而不能是其他类型的值。WeakSet中的对象都是弱引用,即如果没有其他的引用指向该对象,那么该对象会被垃圾回收机制回收,同时它也会自动从WeakSet中删除。因此,WeakSet不可枚举。
4. **WeakMap**
WeakMap也是ES6提供的一种新的数据结构,表示键值对的弱映射。WeakMap的键必须是对象,而值可以是任意类型。与Map不同的是,WeakMap的键是弱引用,即如果键不再被引用,那么该键值对就会被自动删除。WeakMap也是不可枚举的。
**总结**
* Set和Map的主要区别在于,Set的成员是唯一的,而Map的成员是键值对。
* WeakSet和WeakMap都是弱引用的数据结构,它们的键都是对象,并且当键不再被引用时,对应的键值对会被自动删除。这是为了防止内存泄漏,因为普通的Set和Map会强引用它们的键,即使这些键在其他地方不再被使用。
* WeakMap的键是弱引用,因此它的size属性无法访问,也无法使用forEach()和clear()等方法。这是因为如果尝试枚举或清除WeakMap,可能会破坏其弱引用的特性。