默认 不支持 链式调用 的方法: add, attempt, camelCase, capitalize, ceil, clamp, clone, cloneDeep, cloneDeepWith, cloneWith, conformsTo, deburr, defaultTo, divide, each, eachRight, endsWith, eq, escape, escapeRegExp, every, find, findIndex, findKey, findLast, findLastIndex, findLastKey, first, floor, forEach, forEachRight, forIn, forInRight, forOwn, forOwnRight, get, gt, gte, has, hasIn, head, identity, includes, indexOf, inRange, invoke, isArguments, isArray, isArrayBuffer, isArrayLike, isArrayLikeObject, isBoolean, isBuffer, isDate, isElement, isEmpty, isEqual, isEqualWith, isError, isFinite, isFunction, isInteger, isLength, isMap, isMatch, isMatchWith, isNaN, isNative, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isRegExp, isSafeInteger, isSet, isString, isUndefined, isTypedArray, isWeakMap, isWeakSet, join, kebabCase, last, lastIndexOf, lowerCase, lowerFirst, lt, lte, max, maxBy, mean, meanBy, min, minBy, multiply, noConflict, noop, now, nth, pad, padEnd, padStart, parseInt, pop, random, reduce, reduceRight, repeat, result, round, runInContext, sample, shift, size, snakeCase, some, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, startCase, startsWith, stubArray, stubFalse, stubObject, stubString, stubTrue, subtract, sum, sumBy, template, times, toFinite, toInteger, toJSON, toLength, toLower, toNumber, toSafeInteger, toString, toUpper, trim, trimEnd, trimStart, truncate, unescape, uniqueId, upperCase, upperFirst, value, and words。
(4)demo // 隐式链 - 自动结束 _([1, 2, 3]).head() // 注意:_([1, 2, 3]).head().reverse() 会报错,因为head()已经触发了自动结束。 // 隐式链 - 需手动结束 _([1, 2, 3]) .reverse() .value(); // --------------------------------------------- var users = [ { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 } ]; // 启用显式链 方法一 _(users) .chain() .head() .pick('user') .value(); // => { 'user': 'barney' } // 启用显式链 方法二 _.chain(users) .head() .pick("user") .value(); // => { 'user': 'barney' } (5)处理中间结果tap - 适合打印中间结果
thru - 适合修改中间结果
1、tap - 直接修改值 _([1, 2, 3]) .tap(function(array) { // 改变传入的数组 array.pop(); }) .reverse() .value(); // => [ 2, 1 ] 2、thru - 需返回值 _(' abc ') .chain() .trim() .thru(function(value) { return [value]; }) .value(); // => ['abc'] (6)copy 链式队列(可换新值传入)plant
re = _.chain([1, 2, 3]).head(); re2 = re4.plant([4, 5, 6]); re2.value(); // => 4对于 隐式链 - 自动结束 的链式队列,plant 会无计可施,建议转为显式的链式队列写法,再用plant。
四、总结 1、lodash 的优势 (1)支持函数式编程函数式编程(functional programming)是一种将计算建模为表达式求值的编程风格。与命令式编程相反,命令式编程中的程序由在执行时更改全局状态的语句组成。函数式编程通常避免使用可变状态,而倾向于无副作用的函数和不可变数据。
lodash 提供了 lodash/fp ,可支持函数式编程。这个文章开头有介绍,不赘述。
类似的库还有 Ramda。
(2)支持按需加载这个文章开头有介绍,不赘述。
(3)Immutable相反叫mutable
所有的方法都不会改变传入参数的原始对象,只会返回一个新的对象。
但也有特例,比如 remove 方法。
(4)Compose(组合)通过 flow,这个在上文有介绍,不赘述。
(5)lazy evaluation(惰性求值)这个在 Sqe 章节有介绍,不赘述。
提一句,flow 也支持 lazy evaluation。
(6)null-safe各种方法普遍对 null 值容错。
(7)不侵入原型