常见工具函数
防抖函数
- 利用防抖函数,控制执行函数的触发次数,只提交最后一次(可设置首次提交)
- 设定间隔时间内只执行一次,如果频繁触发事件,那么让任务每次都重新计时
- 优化:利用柯里化函数思想
function debouncePlus(fn, delay = 500, immediate = true) {
if(typeof fn !== 'function') {
throw new TypeError('fn 不是一个函数')
}
if(typeof immediate !== 'boolean') {
immeaiate = true;
}
let t = null;
return function() {
let _self = this,
args = arguments,
now = immediate && !t;
clearTimeout(t);
t = setTimeout(() => {
t = null;
!now ? fn.apply(_self, args) : null
}, delay)
now ? fn.apply(_self, args) : null
}
}
节流函数
- 控制事件触发的频率
- 设定指定时间内无论如何执行一次,如果频繁触发事件,不作回应,必须等待间隔时间
function throttlePlus(fn, time) {
if(typeof fn !== 'function') {
throw new TypeError('fn 不是一个函数')
}
let t = null,
begin = now Date().getTime();
return function() {
let _self = this,
args = arguments,
curr = new Date().getTime();
clearTimeout(t)
if(curr - begin >= time) {
fn.call(_self,...args);
begin = curr;
}else {
t = setTimeout(() => {
fn.call(_self, ...args)
}, time);
}
}
}
ES6深拷贝
- 只针对数组或对象进行深拷贝,不考虑其它问题如:Date 对象,RegExp对象
function deepClone(origin) {
if(origin === 'undefined' || typeof origin !== 'object') {
return origin;
}
let target = new origin.constructor();
for(let k in origin) {
if(Object.hasOwn(origin, k)) {
target[k] = deepClone(origin[k])
}
}
return target;
}
封装 typeof
- typeof 无法准确识别 null ,Array
- instanceof 检测的是原型之间的关联性,无法准确识别 Function,Array, 原因:函数 || 数组也是特殊的对象
- 一般 对象原型方法 toString() 可以满足日常开发了
- 注释:typeof 检测类型 返回一个小写字符串如 string, toString() 检测类型 返回一个数组字符串如 '[object Array]'
function typeOfPlus(val) {
let type = typeof val,
toStr = Object.prototype.toString;
let res = {
'[object Array]': 'array',
'[object Object]': 'object',
'[object Number]': 'object number',
'[object String]': 'object string',
'[object Boolean]': 'object boolean',
'[object RegExp]': 'object RegExp',
'[object Date]': 'object Date'
}
if(val === null) {
return 'null'
}else if(type === 'object') {
let ret = toStr.call(val)
return res[ret];
} else {
return type;
}
}
数组去重
let arr = [2, 4, 5, 56, 6, 56, 5, 6, 'int', 'Gen', 'int']
function removeRepetition(arr) {
return arr.filter((item, index) => {
return arr.indexOf(item) === index;
})
}