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

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

我认为两者都很出色,但我对它们的工作原理了解不足,无法进行有意义的比较,我想了解更多的差异。


当前回答

Lodash获得了_.mapValues(),它与Undercore.js的_.mapObject()相同。

其他回答

如果像我一样,您期望Undercore.js和Lodash之间的使用差异列表,那么有一个从Undercore.jss迁移到Lodash的指南。

以下是留给子孙后代的现状:

下面的任何一个都是LodashUndercore _.all是Lodash _.every下划线_.compose是Lodash _.flowRightUndercore _.contains是Lodash _.includesundercore_.each不允许通过返回false退出Undercore_.findLodash在哪里_.find默认情况下,Undercore _.flatten为深,而Lodash为浅Undercore_.groupBy支持传递参数(value、index、originalArray)的iterate,而在Lodash中,_.groupBy的iteratee只传递了一个参数:(value)。未定义第三个参数的Undercore.js_.indexOf是Lodash _.indexOf具有第三个参数true的Undercore.js_.indexOf是Lodash _.sortedIndexOfUndercore_.indexBy是Lodash _.keyBy调用的核心是Lodash_.invokeMapUndercore_.mapObject是Lodash _.mapValuesUndercore_.max组合Lodash _.max和_.maxByUndercore_.min组合Lodash _.min和_.minByUndercore_.sample组合Lodash _.sample&_.sampleSizeUndercore_.object组合了Lodash _.fromPairs和_.zip对象谓词下面的省略是Lodash省略下划线_.pairs是Lodash _.to pairs谓词下面的pickBy是Lodash_.pickBy下面是Lodash地图Undercore_.sortedIndex组合了Lodash _.sorted索引和_.sorttedIndexOf迭代者的下划线_.uniq是Lodash _.uniqByUndercore _.哪里是Lodash _.filterUndercore_.isFinite与Number.isFinite不对齐(例如_.isFinite('1')在Undercore.js中返回true,但在Lodash中返回false)Undercore_.matches速记不支持深度比较(例如,_.filter(对象,{“a”:{“b”:“c”}}))下划线≥1.7&Lodash _.template语法为_.templ(字符串,选项)(数据)内存缓存是类似于地图的对象Lodash不支持许多支持_.bind的方法的上下文参数Lodash支持隐式链接、惰性链接和快捷方式融合Lodash将其过载的_头、_尾、_尾和_首字母拆分为_take,take对,drop,和drop对(即Undercore.js中的_.head(array,2)是Lodash中的_.take(array))

他们非常相似,Lodash正在接手。。。

它们都是一个实用程序库,在JavaScript中占据了实用程序的世界。。。

看来Lodash现在更新得更频繁了,所以在最新的项目中使用得更多了。。。

此外,洛达什似乎比几位KBs更轻。。。

两者都有很好的API和文档,但我认为Lodash更好。。。

下面是获取数组第一个值的每个文档项的屏幕截图。。。

Undercore.js:

Lodash公司:

由于事情可能会不时更新,只需查看他们的网站。。。

洛达什牌手表

下划线.js

Lodash的灵感来自Underscore.js,但现在它是一个更好的解决方案。你可以定制你的版本,拥有更高的性能,支持AMD,并拥有更多的功能。检查jsperf上的Lodash与Undercore.js基准测试。。。这篇关于Lodash的精彩文章:

处理集合时,最有用的功能之一是速记语法:(尽管Undercore现在也支持此语法)

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

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

// Using Underscore.js
_.filter(characters, character => character.age === 36);

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

(摘自Lodash文档)

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

由于Lodash的更新频率高于Undercore.js,因此提供了一个Lodash下划线构建,以确保与Undercore.jss的最新稳定版本兼容。

有一次,我甚至获得了Undercore.js的推送访问权限,部分原因是Lodash负责提出30多个问题;Undercore.js v1.4.x+中的漏洞修复、新功能和性能提升。

此外,至少有三个Backbone.js样板默认包含Lodash,而Lodash现在在Backbone.js的官方文档中被提及。

查看Kit Cambridge的帖子“向Lo Dash问好”,了解Lodash和Undercore.js之间的区别。

脚注:

Undercore.js对数组、字符串、对象和参数对象的支持不一致。在较新的浏览器中,Underscore.js方法忽略数组中的洞,“Objects”方法迭代参数对象,字符串被视为类似数组,方法正确迭代函数(忽略其“prototype”属性)和对象(迭代阴影财产,如“toString”和“valueOf”),而在较旧的浏览器中则不会。此外,Undercore.js方法(如_.clone)可以保留数组中的孔,而其他方法(如.flatten)则不会。

除了约翰的回答,阅读Lodash(我之前一直认为Lodash是Undercore.js的“我也是”),查看性能测试、阅读源代码和博客文章之外,还有以下几点使Lodash远优于Undercore.jss:

这不是关于速度,而是关于速度的一致性(?)

如果您查看Undercore.js的源代码,您将在前几行中看到Undercore.jss依赖于许多函数的本地实现。尽管在理想的情况下,这会是一种更好的方法,但如果您查看这些幻灯片中提供的一些性能链接,就不难得出结论,即这些“本地实现”的质量因浏览器而异。Firefox在某些功能上非常快,在某些Chrome中占据主导地位。(我想在某些情况下,Internet Explorer也会占据主导地位)。我认为,最好选择性能在浏览器之间更一致的代码。

一定要早一点阅读博客文章,不要为了它而相信它,而是通过运行基准来自己判断。我现在很震惊,看到Lodash在Chrome中的Array.every等简单的原生函数中比Undercore.js快100-150%!

Lodash中的临时演员也很有用。至于Xanax的一条备受好评的评论,建议对Undercore.js的代码做出贡献:拥有良好的竞争总是更好的,这不仅能保持创新,还能让你保持自己(或你的库)的良好状态。

这里列出了Lodash之间的差异,它的Undercore.js构建是Undercore.jss项目的替代品。