什么是纯函数?
- 纯函数即类似于数学上的函数, 相同的输入始终得到相同的输出, 而且没有任何的副作用, 类似于数学中的 y(x)
使用纯函数的库有哪些?
- Lodash
- Folktale
- Remad
数组中的slice和splice有什么区别?
- slice 返回数组中指定的部分,不会改变原数组
- splice返回数组中指定的部分,会改变原数组
```javascript
/**
- @desc 纯函数: 相同的输入始终会得到相同的输出 */
// slice函数是纯函数 不会改变原数组,始终输出相同的值 let arr = [1, 2, 3, 4, 5]; console.log(arr.slice(0, 3)); console.log(arr.slice(0, 3)); console.log(arr.slice(0, 3));
// splice函数不是纯函数,因为会修改纯数组,每次输出的值都不一样 console.log(arr.splice(0, 3)); console.log(arr.splice(0, 3)); console.log(arr.splice(0, 3));
// 自定义纯函数 function getSum(n1, n2) { return n1 + n2; } console.log(getSum(1,2)) console.log(getSum(1,2)) console.log(getSum(1,2))
模拟Lodash的memoize函数
```javascript
/**
* @desc 演示Lodash
*
*/
const _ = require("lodash");
// const arr = ['jack', 'tom', 'rows']
// console.log(_.first(arr))
// console.log(_.last(arr))
// console.log(_.toUpper(_.first(arr)));
// console.log(_.reverse(arr));
// const r = _.each(arr, (item, index) =>{
// console.log(item, index);
// })
// console.log(r)
// 记忆函数
function getArea(r) {
console.log('r', r);
return Math.PI * r * r;
}
const getAreaWithMemoize = _.memoize(getArea);
console.log(getAreaWithMemoize(4))
console.log(getAreaWithMemoize(4))
console.log(getAreaWithMemoize(4))
console.log(getAreaWithMemoize(4))
/**
*
* @desc 模拟Lodash的memoize函数
* @param {function} fn
*/
function memoize(fn) {
if(typeof fn !== 'function'){
throw new TypeError('Expected a function');
}
let cache = new Map();
return function(...args) {
const key = args ? args[0] : '';
if(cache.has(key)){
return cache.get(key)
}
const result = fn.apply(this, args);
cache = cache.set(key, result) || cache
return result;
}
}
const getAreaWithMemoize = memoize(getArea);
console.log(getAreaWithMemoize(4))
console.log(getAreaWithMemoize(4))
console.log(getAreaWithMemoize(4))
Lodash的memoize源码
/**
* @desc Lodash的memoize函数源码实现
*/
// function memoize(fn, resolver) {
// if(typeof fn !== 'function' || (resolver != null && typeof resolver !== 'function')){
// throw new TypeError('Expected a function');
// }
// let cache = new Map();
// const memoized = function(...args){
// const key = resolver ? resolver.apply(resolver, args) : args[0]
// // console.log('key', key) // 4
// // const cache = memoized.cache;
// // console.log('cache', cache) // Map对象
// if(cache.has(key)){
// return cache.get(key)
// }
// const result = fn.apply(fn, args)
// // console.log('result', result) // result 50.26548245743669
// cache = cache.set(key, result) || cache
// return result
// }
// // memoized.cache = new (memoize.cache || Map)
// return memoized;
// }
// const getAreaWithMemoize = memoize(getArea);
// console.log(getAreaWithMemoize(4))
// console.log(getAreaWithMemoize(4))
// console.log(getAreaWithMemoize(4))