深拷贝
function deepCopy(object) {
if (!object || typeof object !== 'object')
return;
let newObject = Array.isArray(object) ? [] : {};
//遍历对象中的key
for (let key in object) {
//判断对象中有该键值吗
if (object.hasOwnProperty(key)) {
//如果键值是对象递归,如果不是,将这个这个键值存到数组中
newObject[key] =
typeof object[key] === "object" ? deepCopy(object[key]) : object[key];
}
}
return newObject;
}
手写new
function mynew(Func, ...args) {
// 1.创建一个新对象
const obj = {}
// 2.新对象原型指向构造函数原型对象
obj.__proto__ = Func.prototype
// 3.将构建函数的this指向新对象
let result = Func.apply(obj, args)
// 4.根据返回值判断
return result instanceof Object ? result : obj
}
防抖和节流简单写法
// 防抖
function debounce(fn, time) {
//这里相当于定义了一个全局的timer
let timer = null;
return function () {
//如果定时器存在,那就清掉,开启新的计时器
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.apply(this, arguments);
}, time);
}
}
// 节流
function throttle(fn, delay) {
//相当于在全局定义了一个timer
let timer = null;
return function () {
//如果timer存在,直接结束函数
if (timer) {
return
}
timer = setTimeout(() => {
fn.apply(this, arguments);
//指定时间结束后,将timer变成null,否则这个函数将一直不执行
timer = null
}, delay);
}
}
防抖:
定义:防止用户触发某个行为,只识别一次 「频繁的定义可以自己管控」
节流:
定义:用户频繁操作的时候,不根据用户的频繁操作度来绝定触发多少次,而是根据设定好的频率进行触发,实现“降频”的效果,相对于防抖来讲,节流是允许触发多次的!
防抖场景:
场景一:点击按钮,向服务器发送请求(需要一定的时间),在当前请求没有成功之前,再次点击按钮应该什么都不处理才对
防抖代码:节流思路:
应用场景: onscroll Input输入框的keydown keyup input事件 等等
代码: