更新日志 Release

lodash v4.0.0

2015年是大年! Lodash 成为 最依赖 npm 包,通过了 10 亿 下载,其 v3 版本得到了广泛采用!

这一年也是合作的一年,因为关于 合并 Lodash 和 Underscore 的讨论开始了。 Lodash v4 的大部分内容都在验证这些讨论中的想法。如果没有 Underscore 核心团队的协作和贡献,Lodash v4 将无法实现。本着合并的精神,我们的团队与 几个成员 为这两个库做出了贡献。

对于 2016 年和 lodash v4.0.0,我们想要放松,向前推进,并将事情提升一个档次!

Modern only

借助 v4,我们摆脱了 旧项目、旧环境并放弃了 [旧 IE < 9 支持](https://www.microsoft.com/en -us/WindowsForBusiness/IE 支持结束)!

4 kB Core

随着新方法和功能的添加,Lodash 的厨房水槽尺寸将继续增长。但是,我们现在提供与 [Backbone v1.2.4](https:// github.com/jashkenas/backbone/issues/3839),适合那些想要 Lodash 而不会拖着厨房水槽的人。

More ES6

我们继续使用 _.isSymbol 等方法支持 ES6,增加了对克隆和比较数组缓冲区、映射、集合和符号的支持,将迭代器转换为数组 , & 可迭代的_(…)

此外,我们还发布了一个 es-build & 拉取了 [babel-plugin-lodash](https://github .com/lodash/babel-plugin-lodash) 进入核心,让摇树变得轻而易举。

More Modular

突击测验! 📣 bindAll 方法属于什么类别路径? 是吗

A) require('lodash/function/bindAll') B) require('lodash/utility/bindAll') C) require('lodash/util/bindAll')

不知道? 好吧,使用 v4 没关系,因为现在模块路径就像

js
const bindAll = require('lodash/bindAll')

我们还降低了模块的复杂性,从而更容易创建更小的包。 这有助于 Lodash 采用 AsyncRedux 等库!

1st Class FP

在 v3 中,我们引入了 lodash-fp。 我们学到了很多,在 v4 中我们决定 将其拉入核心

现在,您可以获得不可变、自动柯里化、迭代优先、数据最后的方法,就像

js
const _ = require('lodash/fp')
const object = { a: 1 }
const source = { b: 2 }
const newObject = _.assign(source)(object)

console.log(newObject)
// => { 'a': 1, 'b': 2 }

console.log(object)
// => { 'a': 1 }

const convert = require('lodash/fp/convert')
const assign = convert('assign', require('lodash.assign'))
// works too!

Chakra Optimized

实际上,虽然我们 对 Chakra 感到兴奋,但 Lodash 已针对**所有引擎的出色性能进行了优化 **。 与许多库不同,我们不支持单一引擎,因此无论引擎如何,我们都可以提供可靠的性能和支持。

在 v4 中,我们继续对性能的承诺; 扩展对惰性评估的支持并提高循环引用检测等核心功能的性能。

Emojis

更上一层楼 Lodash v4 增加了对表情符号的支持! 包括诸如 astral symbols, unicode modifiers, variation selector characters, zero-width joiners, & regional indicator symbols.

Breaking changes

我们在此版本中引入了比任何其他版本更多的重大更改,因此请务必查看 changelog 以获取完整的更改概要 & 给 lodash-migrate 一个旋转,以帮助将旧的 Lodash 代码迁移到最新版本。

如果你喜欢 Lodash,别忘了给 repo 加注星标(https://github.com/lodash/lodash/stargazers)或`npm star lodash`!

lodash v3.0.0

一年多后,超过 2,000 commits 我们很高兴发布 lodash v3.0.0。 lodash 遵循 语义版本控制,因此在这个主要版本中,我们借此机会清理内部并进行 一些向后兼容的重大更改。 我们稍后会讨论,但首先让我们谈谈这个版本提供的所有很酷的东西。

String methods

根据大众的需求,我们调查了实用程序环境,以查找要添加到 lodash 的字符串 API 的横截面。 我们确定了 17 种字符串方法: _.camelCase, _.capitalize, _.deburr, _.endsWith, _.escapeRegExp, _.kebabCase, _.pad, _.padLeft, _.padRight, _.repeat, _.snakeCase, _.startsWith, _.trim, _.trimLeft, _.trimRight, _.trunc, & _.words

有来自 ES5 的熟悉方法,如 _.trim,& ES6,如 _.endsWith_.repeat、& _.startsWith,还有一些鲜为人知的方法,如 _.deburr & _.kebabCase

js
// 像`String#trim`一样修剪空白,但也允许指定要修剪的字符
_.trim('  abc  ')
// → 'abc'
_.trim('-_-abc-_-', '_-')
// → 'abc'

// 也适用于`_.map`
_.map(['  foo  ', '  bar  '], _.trim)
// → ['foo', 'bar']

// deburr diacritical marks (http://en.wikipedia.org/wiki/Diacritic)
_.deburr('déjà vu')
// → 'deja vu'

// similar to a `dasherize` or `slugify` method
_.kebabCase('foo bar')
// → 'foo-bar'

遵循像_.camelCase_.kebabCase_.snakeCase这样的方法的大小写规则允许字符串从骆驼大小写转换为烤肉大小写、蛇大小写,然后再转换回来。

js
_.camelCase(_.snakeCase(_.kebabCase('fooBar')))
// → 'fooBar'

ES is our jam

以前版本的 lodash 添加了 _.assign_.find_.findIndex 和 ES 模板分隔符支持。 在这个版本中,我们通过对齐 _.includes_.isFinite_.keys,支持 _.clone_.isEqual 中的类型化数组,将我们的 ES 采用率提高了一个档次, 使用 SetWeakMap 获得 性能-gains,允许将 Map & WeakMap 用作 _.memoize.Cache,并支持 ES 模块化构建lodash-cli

Functional goodies

v3 中有很多功能性好东西,例如 _.ary_.curryRight_.flow_.rearg,并支持 _.bind_.bindKey 中的可自定义参数占位符 、_.curry_.curryRight_.partial_.partialRight

js
// infomercial fail
_.map(['6', '8', '10'], Number.parseInt)
// → [6, NaN, 2]

// 使用占位符传递`string`参数并指定`0`的`radix`
_.map(['6', '8', '10'], _.partial(Number.parseInt, _, 0))
// → [6, 8, 10]

// is equivalent to
_.map(['6', '8', '10'], (value) => {
  return Number.parseInt(value, 0)
})

// customize `_.partial.placeholder`
_.partial.placeholder = '_'
_.map(['6', '8', '10'], _.partial(Number.parseInt, '_', 0))
// → [6, 8, 10]

现在还有几种方法开箱即用作为_.map_.reduce等方法的迭代器

js
_.map(['6', '8', '10'], _.parseInt)
// → [6, 8, 10]

_.map(['a', 'a'], ['b', 'b'], _.uniq)
// → [['a'], ['b']]

_.reduce([{ b: 2 }, { c: 3 }], _.assign, { a: 1 })
// → { 'a': 1, 'b': 2, 'c': 3}

我们从一些函数式编程爱好者那里听说 lodash 不够功能,经常引用我们的方法签名作为一个问题。 为了简化组合和柯里化,他们更喜欢像_.filter这样的方法首先是predicate然后是collection,而不是首先是collection和其次是predicate

Butter-side up

那些粉丝在 lodash 上因为方法签名这样的小东西而输掉是一种耻辱,所以在 v3 中,我们添加了 _.ary_.rearg_.ary 方法设置函数的参数上限 & _.rearg 重新排列提供给函数的参数。

js
// 将提供给“parseInt”的参数数量限制为一个
_.map(['6', '8', '10'], _.ary(Number.parseInt, 1))
// → [6, 8, 10]

// create a `filter` that’s predicate-first
const filter = _.rearg(_.filter, 1, 0)
filter('a', [{ a: 0 }, { a: 1 }])
// → [{ 'a': 1 }]

// create an `includes` that’s auto-curried & needle-first
const includes = _(_.includes).ary(2).rearg(1, 0).curry(2).value()
includes(2)([1, 2, 3])
// → true

您还可以使用单独的包,例如 lodash.ary、[lodash.curry](https://www.npmjs.com/package/lodash. curry), & lodash.rearg 来转换函数。

js
const ary = require('lodash.ary')
const curry = require('lodash.curry')
const rearg = require('lodash.rearg')

const getobject = require('getobject')
const get = curry(rearg(ary(getobject, 2), [1, 0]), 2)

get('a.b.c')({ a: { b: { c: 'foo' } } })
// → 'foo'

Combined with _.runInContext you could easily create a version of lodash with auto-curried iteratee-first methods. In fact, that’s what we’ve done! Introducing lodash-fp.

js
const items = [
  { value: _.constant(['a', 'b']) },
  { value: _.constant(['b', 'c']) }
]

const getValues = _.flow(
  _.map(_.result('value')),
  _.flatten,
  _.uniq
)

getValues(items)
// => ['a', 'b', 'c']

_.map(Number.parseInt)(['6', '08', '10'])
// → [6, 8, 10]

lodash 通过使用 WeakMap 来存储函数元数据,降低了 _.ary_.curry_.rearg 产生的方法包装的成本。以这种方式,一个函数只被包装一次,即使它可能应用了_.ary_.curry_.rearg

模块,模块,模块

在 lodash v2 中,我们引入了 npm packages per-method 以及用于 AMD 和 Node.js 的模块包。在 v3 中,我们改进了 lodash-cli's 内联依赖项的能力,使我们能够轻松自定义每个方法的内联,从而更好地平衡深度依赖关系图和代码重复。

此外,所有模块化依赖项现在都使用 ^ 版本范围,而不是 ~,因此它们会根据需要进行更新,而无需您担心。展望未来,所有按方法包将独立更新,而不是批量更新,因为 lodash-cli 很快将能够检测包中的更改并自动增加补丁/次要版本号。

lodashlodash-compat npm 包现在带有内置模块也。 非常适合 browserifywebpack

js
// load the modern build
const _ = require('lodash')
// or a method category
const array = require('lodash/array')
// or a method
const chunk = require('lodash/array/chunk')

方法模块按类别组织,因此它们易于查找

lodash 有多种其他构建和模块格式。

### 表现

通过更好地利用 JavaScript 引擎中的 JIT、使用避免优化不合格和增加函数内联可能性的内部辅助函数,我们在 v3 中整体性能提高了 20-40%。

performance comparison v3 vs v2

在 v3 中,我们还引入了 懒惰评估 链接以实现 [大规模性能胜利](http://jsperf.com/lazy-demo #chart=bar) 在某些情况下。

如上所述,我们将 SetWeakMap 用于 performance-[gains](http://jsperf .com/weakmap-wrap#chart=bar),所有现代浏览器、Node.js 和 io.js 都可以从中受益。

重大变化

lodash v3 是一个重大改进,我们引入了几个向后兼容的重大更改。 一个这样的变化是,虽然我们仍然测试Underscore/B...