什么是纯函数?
- 纯函数即类似于数学上的函数, 相同的输入始终得到相同的输出, 而且没有任何的副作用, 类似于数学中的 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) || cachereturn 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))
