链式调用

用于处理复杂的数据转换

优化代码,提高阅读性

chain

创建一个 lodash 包装实例。

// 若想解除链式(获得值)必须调用 value 方法。
_.chain(1)
  // ...
  .value()
// => 1

tap

该方法的目的是进入方法链序列以便修改中间结果。

_.chain([1, 2, 3])
 .tap(function(array) {
  // 改变传入的数组
   array.pop();
 })
 .reverse()
 .value();
// => [2, 1]

thru

该方法的目的是”传递” 值到一个方法链序列以取代中间结果。

_.chain('  abc  ')
 .chain()
 .trim()
 .thru(function(value) {
   return [value];
 })
 .value();
// => ['abc']

不太重要

注意(惰性)

若是值为原始类型,那么值不能改,改了也没用,还是会用原来值

若是值为引用类型,那么引用指针不能改,改了也没用,只能在源对象上进行操作

隐式调用

结尾必须是返回原始值或唯一值的函数

才会自动执行整个链条函数(value 函数)

否则就和显示调用一样了…value 结尾才返回值

let arr = [1, 2, 3];

_(arr)
  .map(num => num * num)
  .sum();
// => 14

_(arr)
  .map(num => num * num)
  .thru(num => num[1])
  .value();
// => 14

显式调用

结尾必须是 value 函数

显式的结束整个链条

个人通常用这个比较多…感觉比隐式明确些

let arr = [];

let handler = _
  .chain(arr)
  .map(num => num * num)
  .sum();

// 这里如果是 arr = [1, 2, 3, 4];
// 引用指针发生了变化,会计算异常
// 还是会按照原指针(空数组)进行计算
arr.push(1, 2, 3, 4);

console.log(handler.value());