lodash 学习笔记 (2)

注: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 方法。即将一定时间内的连续调用归为一个

应用:

当窗口停止改变大小之后重新计算布局

对用户输入的验证,避免在输入过程中处理,而是在停止输入后处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygjgp.html