Chain
可以说是 lodash 中最为重要的部件,想要用lodash进行复杂的多步操作都离不开chain的帮助。
首先说说Chain的调用方式有两种:一种是显式调用(Explicit Chaining),一种是隐式调用(Implicit Chaining)。
从上面例子可以看出,隐式调用比显式调用更加简洁方便。
为什么要多出来一个 .value(),而不是直接出结果呢?那是因为可能要等待延时(Deferred execution)数据的到来,再执行取值。这就是我们常说的Lazy evaluation (延迟计算/惰性求值)
2.1 _(value)
显式(Explicit Chaining) or 隐式(Implicit Chaining)
听起来好乱!看看 lodash的API怎么说:
_(value) Creates a lodash object which wraps value to enable implicit chaining. Methods that operate on and return arrays, collections, and
functions can be chained together. Methods that retrieve a single
value or may return a primitive value will automatically end the chain
returning the unwrapped value. Explicit chaining may be enabled using
.chain. The execution of chained methods is lazy, that is, execution is deferred until #value is implicitly or explicitly called.
大意如下:
_(value)建立了一个隐式链对象,可以把那些能操作并返回 arrays(数组)、collections(集合)、functions(函数)的”.Methods”(lodash的函数)串起来。 那些能返回“唯一值(single value)”或者可能返回原生数据类型(primitive value)会自动结束链式反应。
而显式链则用_.chain. 的方式实现延迟计算,即:求值操作等到 _value()被调用时再执行。
Lazy evaluation allows several methods to support shortcut fusion. Shortcut fusion is an optimization strategy which merge iteratee calls; this can help to avoid the creation of intermediate data structures and greatly reduce the number of iteratee executions.
延迟计算允许一些方法支持shortcut fusion 。由于执行被延后了,因此lodash可以进行shortcut fusion这样的优化,通过合并链式iteratee大大降低迭代的次数。