一.手写一个forEach函数
function forEach(array, fn) {
for (let i = 0; i < array.length; i++) {
fn(array[i]);
}
}
二.手写一个filter函数
function filter(array, fn) {
let result = [];
for (let i = 0; i < array.length; i++) {
if (fn(array[i])) {
result.push(array[i]);
}
}
return result;
}
三.手写一个once函数(也就是函数只能调用一次)
function once(fn) {
let done = false;
return function () {
if (!done) {
done = true;
return fn.apply(this, arguments);
}
};
}
四.手写一个map函数
const map = (array, fn) => {
let result = [];
for (let value of array) {
result.push(fn(value));
}
return result;
};
五.手写一个every函数
const every=(array,fn)=>{
let result=true;
for(let value of array){
result=fn(value);
if(!result){
break;
}
}
return result;
}
六.手写一个some函数
const some=(array,fn)=>{
let result=true;
for(let value of array){
result=fn(value);
if(result){
break;
}
}
return result;
}
七.闭包的应用
7.1实现一个数字的平方
function makepow(power){//平方次数
return function(number){//数字
return Math.pow(number,power)
}
}
7.2实现计算公司总工资
function makeSalary(base){//基本工资
return function(performance){//绩效工资
return base + performance;//总工资
}
}
八.模拟memozie 缓存函数
function memoize(f){
let cache={}
return function(){
let key =JSON.stringify(arguments);
cache[key]=cache[key] || f.apply(f,arguments);
return cache[key]
}
}
function getArea(r){
console.log(r);
return Math.PI * r * r;
}
let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
九.函数柯里化
function curry(func){
return function curriedFn(...args){
//判断实参形参的个数
if(args.length < func.length){
return function(){
return curriedFn(...args.concat(Array.from(arguments)));
}
}
return func(...args)
}
}
function getSum(a,b,c){
return a+b+c;
}
const curried=curry((getSum));
console.log(curried(1,2,3));
console.log(curried(1)(2,3));
console.log(curried(1,2)(3));
十.组合函数
function compose (...args){//组合函数 从右到左依次调用
return function(value){
return args.reverse().reduce(function(acc,fun){//把前一个函数执行完的结果传给第2个
return fun(acc)
},value)
}
}
const compose=(...args)=>value=>args.reverse().reduce((acc,fun)=>fun(acc),value);
const reverse=arr=>arr.reverse();
const first=arr=>arr[0]
const toUpper=s=>s.toUpperCase();
const f=compose(toUpper,first,reverse);
console.log(f(['one','two','three']));