协慌网

登录 贡献 社区

lodash 和下划线之间的差异

为什么有人更喜欢lodash.jsunderscore.js实用程序库而不是另一个?

Lodash 似乎是下划线的替代品,后者已经存在了更长时间。

我认为两者都很精彩,但我对他们如何努力进行有根据的比较并不了解,我想更多地了解这些差异。

答案

我创建了 Lo-Dash,为数组,字符串,对象和arguments对象1提供更一致的跨环境迭代支持。它已成为 Underscore 的超集,提供更一致的 API 行为,更多功能 (如 AMD 支持,深度克隆和深度合并),更全面的文档和单元测试(在 Node,Ringo,Rhino,Narwhal,PhantomJS 中运行的测试)和浏览器),更好的整体性能和大型数组 / 对象迭代的优化,以及自定义构建和模板预编译实用程序的更大灵活性。

由于 Lo-Dash 比lodash underscore更新频繁, 因此提供lodash underscore构建以确保与最新稳定版本的lodash underscore兼容。

有一次,我甚至获得了对 Underscore 的推动 ,部分原因是 Lo-Dash 负责筹集超过 30 个问题; Underscore v1.4.x + 中的登陆错误修复,新功能和性能提升。

此外,默认情况下至少有 3 个 Backbone 样板包含 Lo-Dash,现在 Backbone 的官方文档中提到了 Lo-Dash。

查看 Kit Cambridge 的帖子, 向 Lo-Dash 说 “你好” ,以便更深入地分析 Lo-Dash 和 Underscore 之间的差异。

脚注:

  1. Underscore 对数组,字符串,对象和arguments对象的支持不一致。在较新的浏览器中,Underscore 方法忽略数组中的漏洞 ,“Objects” 方法迭代arguments对象,字符串被视为类似数组,方法正确迭代函数(忽略它们的 “原型” 属性)和对象(迭代阴影属性,如 “toString”)和 “valueOf”),而在较旧的浏览器中他们不会。此外,像_.clone这样的_.clone方法_.clone保留数组中的漏洞,而像_.flatten这样的其他_.flatten则不会。

Lo-Dash 的灵感来自下划线,但现在是卓越的解决方案。您可以制作自定义版本 ,具有更高性能 ,支持 AMD 并具有强大的额外功能 。检查这个关于 jsperf 的Lo-Dash vs Underscore 基准测试和... 关于 lo-dash 的这篇很棒的帖子

使用集合时最有用的功能之一是简写语法:

var characters = [
  { 'name': 'barney', 'age': 36, 'blocked': false },
  { 'name': 'fred',   'age': 40, 'blocked': true }
];

// using "_.filter" callback shorthand
_.filter(characters, { 'age': 36 });

// using underscore
_.filter(characters, function(character) { return character.age === 36; } );

// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]

(摘自lodash docs

如果像我一样,你期待下划线和 lodash 之间的使用差异列表,那么有一个从下划线迁移到 lodash 的指南

以下是后人的当前状态:

  • 下划线_.compose是 Lodash _.flowRight
  • 下划线_.contains是 Lodash _.includes
  • 下划线_.findWhere是 Lodash _.find
  • 下划线_.invoke是 Lodash _.invokeMap
  • 下划线_.mapObject是 Lodash _.mapValues
  • 下划线_.pluck是 Lodash _.map
  • 下划线_.where是 Lodash _.filter
  • 下划线_.any是 Lodash _.some
  • 下划线_.all是 Lodash _.every
  • 下划线_.each不允许通过返回false退出
  • 默认情况下,下划线_.flatten很深,而 Lodash 很浅
  • 下划线_.isFiniteNumber.isFinite不对齐
    (例如_.isFinite('1')在 Underscore 中返回true但在 Lodash 中返回false
  • 下划线_.matches简写不支持深度比较
    (例如_.filter(objects, { 'a': { 'b': 'c' } })
  • Underscore≥1.7&Lodash 已将其_.template语法更改为
    _.template(string, option)(data)
  • Lodash _.uniq不接受像iteratee那样的iteratee函数。使用 Lodash _.uniqBy
  • Lodash _.first._last不接受像._last那样的n参数。使用slice
  • Lodash _.memoize缓存是Map like 对象
  • Lodash 支持隐式链接懒惰链接和快捷方式融合
  • Lodash 将重载的_.head_.last . _.rest_.last . _.rest_.initial
    _.take_.takeRight . _.take_.takeRight . _.drop ,& _.dropRight
    (即_.head(array, 2)_.take(array, 2)中是_.take(array, 2)