用ES5实现数组的map方法
核心要点:
1)回调函数的参数有哪些,返回值如何处理。
2)不修改原来的数组。
Array.prototype.MyMap = function(fn, context){
var arr = Array.prototype.slice.call(this);
//由于是ES5所以就不用...展开符了
var mappedArr = [];
for (var i = 0; i < arr.length; i++ ){
mappedArr.push(fn.call(context, arr[i], i, this));
}
return mappedArr;
}
Object.create
function create(proto) {
function F() {};
F.prototype = proto;
F.prototype.constructor = F;
return new F();
}
实现instanceof的作用
核心要点:原型链的向上查找。
function myInstanceof(left, right) {
let proto = Object.getPrototypeOf(left);
while(true) {
if(proto == null) return false;
if(proto == right.prototype) return true;
proto = Object.getPrototypeof(proto);
}
}
实现防抖功能
核心要点:如果在定时器的时间范围内再次触发,则重新计时。
const debounce = (fn, delay) => {
let timer = null; return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
},
delay);
};
};
实现节流功能
核心要点:如果在定时器的时间范围内再次触发,则不予理睬,等当前定时器完成,才能启动下一个定时器。
const throttle = (fn, delay = 500) => {
let flag = true;
return (...args) => {
if (!flag) return;
flag = false;
setTimeout(() => {
fn.apply(this, args);
flag = true;
}, delay);
};
};