注:transform 应该归属于 Object 章节而不是 Collection,但因为跟 reduce 用法挺像,所以这里放在一起做对比。
_.reduce([2, 3, 4], function(sum, n) { return sum + n; // return 值为下一次循环的 sum 值 }, 1); // 1 为初始值 // => 10 _.transform([2, 3, 4, 5 ,6], function(result, n) { result.push(n); return n < 4; // return false 即结束循环 }, [1]); // [1] 为初始值 // => [ 1, 2, 3, 4 ] (8)针对字符串includes:_.includes('pebbles', 'eb'); 可以代替 indexOf
size:_.size('pebbles'); 可以代替 length
建议还是用原生方法。
拓展:用 es6 原生替代 lodash _.forEach([1, 2, 3], (i) => { console.log(i) }) _.map([1, 2, 3], (i) => i + 1) _.filter([1, 2, 3], (i) => i > 1) _.reduce([1, 2, 3], (sum, i) => sum + i, 0) // 使用 ES6 改写 [1, 2, 3].forEach((i) => { console.log(i) }) [1, 2, 3].map((i) => i + 1) [1, 2, 3].filter((i) => i > 1) [1, 2, 3].reduce((sum, i) => sum + i, 0) 3、Date (1)获取时间now - 获取 unix 毫秒数
建议用原生的 Date.now() 。
4、Function (1)函数调用的次数after - >=n 次后才能成功调用函数
应用:可以用作并行异步处理后的回调。
before - 调用次数 <n 次
应用:可以用作次数限制。
once - 只能调用一次函数
应用:用过既废。
上面的方法,若函数不能执行,则返回最近一次的执行结果,如果没有执行过,则为 undefined。
(2)延迟delay - 类似 setTimeout
defer - 类似延时为0的setTimeout。对于执行开销大的计算防止阻塞UI非常有用。
扩展:什么是 偏函数 / 科里化 / 偏应用 ?偏函数:partial function
部分应用函数(偏应用):partially applied function
柯里化:currying
偏函数 :指的是仅能处理入参类型子集的函数。
例如一个函数虽然形参定义的是整形,但只能处理正整形。(即你只能传正整形才能正确调用)。
偏应用:例如在 Scala 中,当函数调用的参数不足时,编译器不会报错,而是先应用已提供的参数,并返回一个新函数,该函数接受原函数剩余未提供的参数作为自己的参数。
未提供的参数可用 _ 占位符表示。
柯里化:在偏应用基础上更进一步,将多参函数分解为一系列的单参函数,例如
curriedDivide(10) 调用第 1 个调用,并返回第 2 个函数
curriedDivide(10)(2) 等于先后调用两个函数
偏应用和柯里化的区别:前者仅产生一个函数,后者可以产生多个函数。
上述概念,本是数学上的概念,但更多的用在了函数式编程上。
参考资料:
(3)柯里化 or 偏应用curry/curryRight:
var abc = function(a, b, c) { return [a, b, c]; }; var curried = _.curry(abc); // 柯里化 curried(1)(2)(3); // => [1, 2, 3] // 偏应用 curried(1, 2)(3); // => [1, 2, 3] // 偏应用提供占位符 curried(1)(_, 3)(2); // => [1, 2, 3] // 也可正常调用 curried(1, 2, 3); // => [1, 2, 3] (4)绑定上下文 or 偏应用bind / bindKey - 既可绑定上下文,也可实现偏应用
partial / partialRight - 不可绑定上下文,仅实现偏应用 ( 即避免使用 .bind(null,…) )
应用:
给多个对象绑定共用函数
给函数预先指定默认参数
// bind - 不支持 bind 后修改 function 和 objcet var greet = function(greeting, punctuation) { return greeting + " " + this.user + punctuation; }; var object = { user: "fred" }; var bound = _.bind(greet, object, "hi"); bound("!"); // => 'hi fred!' // bind - 偏应用的占位符功能 var bound = _.bind(greet, object, _, "!"); bound("hi"); // => 'hi fred!' // ----------------------------------- // bindKey - 支持 bindKey 后修改 object 和(object 中的)function var object = { user: "fred", greet: function(greeting, punctuation) { return greeting + " " + this.user + punctuation; } }; var bound = _.bindKey(object, "greet", "hi"); bound("!"); // => 'hi fred!' // bibindKeynd - 偏应用的占位符功能 var bound = _.bindKey(object, "greet", _, "!"); bound("hi"); // => 'hi fred!' // ----------------------------------- // partial var greet = function(greeting, name) { return greeting + " " + name; }; var sayHelloTo = _.partial(greet, "hello"); sayHelloTo("fred"); // => 'hello fred' // partial - 偏应用的占位符功能 var greetFred = _.partial(greet, _, "fred"); greetFred("hi"); // => 'hi fred' (5)防止函数高频调用debounce - 防抖动/防反跳,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法。即将一定时间内的连续调用归为一个。
应用:
当窗口停止改变大小之后重新计算布局
对用户输入的验证,避免在输入过程中处理,而是在停止输入后处理