Lodash和Underscore.js的区别

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

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

我认为两者都很出色,但我不知道它们是如何进行有教育意义的比较的,我想知道更多关于差异的信息。

358504 次浏览

Lodash的灵感来自Underscore.js,但现在它是一个优越的解决方案。你可以让你的自定义构建,拥有更高的性能,支持AMD并拥有伟大的额外功能。在jspef上检查这个Lodash vs.Underscore.js基准和…这个关于Lodash的精彩文章

使用集合时,最有用的功能之一是简写语法:
(虽然下划线现在也支持这种语法)

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是为了为数组、字符串、对象和arguments对象1提供更一致的跨环境迭代支持。它已经成为Underscore.js的超集,提供更一致的API行为,更多的功能(如AMD支持、深度克隆和深度合并),更彻底的留档和单元测试(在Node.jsRingoJS犀牛独角鲸PhantomJS和浏览器中运行的测试),更好的整体性能和大型数组/对象迭代的优化,以及自定义构建和模板预编译实用程序的更大灵活性。

因为Lodash比Underscore.js更新更频繁,所以lodash underscore build提供确保与最新稳定版本的Underscore.js.兼容

有一次,我甚至被Underscore.js0,部分原因是Lodash负责提出30多个问题;在Underscore.jsv1.4. x+中登陆bug修复、新功能和性能提升。

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

查看Kit Cambridge的帖子对Lo-Dash说"你好",了解Lodash和Underscore.js.之间的差异

脚注:

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

除了博客文章3898916">约翰的回答,阅读Lodash(迄今为止我一直认为这是Underscore.js的“我也是”),查看性能测试,阅读源代码和博客文章,使Lodash优于Underscore.js的几点是:

  1. 这不是关于速度,因为它是关于速度的一致性(?)

如果你查看Underscore.js的源代码,你会在开头几行中看到Underscore.js许多函数的原生实现。尽管在理想情况下,这会是一个更好的方法,但如果你查看这些幻灯片中给出的一些性能链接,就不难得出结论,这些“原生实现”的质量在浏览器之间有很大差异。Firefox在某些功能上非常快,在某些Chrome占据主导地位。(我想在某些情况下Internet Explorer也会占据主导地位)。我认为最好选择性能在浏览器之间更一致的代码。

一定要早点读这篇博文,而不是相信它,通过运行的基准来判断自己。我现在很震惊,看到Lodash在简单本地函数中的表现比Underscore.js快100-150%,比如Chrome中的Array.every

  1. Lodash中的临时演员也非常有用。
  2. 至于Xananax高度赞同的评论,建议对Underscore.js的代码做出贡献:拥有竞争总是更好的,它不仅能保持创新,还能驱使你保持自己(或你的图书馆)的良好状态。

这是Lodash之间的差异列表,Underscore.js构建是您Underscore.js项目的直接替代品。

2014年,我认为我的观点仍然成立:

恕我直言,这个讨论有点过分了。引用上述博客文章

大多数JavaScript实用程序库,例如Undercore、瓦伦丁和吴,依靠“本土第一双重方法”。这种方法更喜欢本机实现,只有在不支持原生等效。但是jsPerf揭示了一个有趣的趋势:迭代数组或类似数组的最有效方式集合是为了完全避免本机实现,选择简单的循环。

好像“简单循环”和“vanilla Javascript”比Array或Object方法实现更原生。天哪…

拥有一个可信的单一数据源当然会很好,但事实并非如此。即使有人告诉你不是这样,亲爱的,也不存在香草神。对不起。唯一真正成立的假设是,我们都在编写JavaScript代码,旨在在所有主要浏览器中表现良好,知道它们都有相同事物的不同实现。委婉地说,这很难应付。但这是前提,不管你喜欢与否。

也许你们所有人都在从事需要twitterish性能的大型项目,这样你现在才能真正看到差异每秒在列表上的850,000(Underscore.js)与250,000(Lodash)迭代之间

就我而言,我不是。我的意思是,我从事的项目中,我必须解决性能问题,但它们从未得到解决,也不是由Underscore.js或Lodash引起的。除非我掌握了实现和性能(我们现在谈论的C++)的真正差异,比如,一个可迭代的循环(对象或数组,稀疏与否!),我宁愿不被基于已经自以为是了的基准平台结果的任何声明所困扰。

它只需要一次更新,比如说,犀牛来设置它的Array方法实现,以一种没有一个“中世纪循环方法表现得更好,永远等等”牧师可以围绕一个简单的事实争论他/她的方式,即Firefox中的突然数组方法比他/她自以为是的大脑要快得多。伙计,你不能通过欺骗你的运行时环境来欺骗你的运行时环境!在推广…

你的多功能腰带

…下次。

为了保持相关性:

  • 使用Underscore.js,如果你在不牺牲本土的方便。
  • 如果你喜欢方便并且喜欢它的扩展功能目录(深度副本等),并且如果你迫切需要即时性能,最重要的是,不要介意在原生API胜过固执己见的变通方法后立即选择替代方案,请使用Lodash。这很快就会发生。时期。
  • 甚至还有第三种解决方案。DIY!了解你的环境。了解不一致之处。阅读他们的(约翰-大卫杰里米)代码。在无法解释为什么真正需要一致性/兼容性层并增强你的工作流程或提高应用程序性能的情况下,不要使用这个或那个。你的需求很可能满足于一个简单的聚填充,你完全可以自己编写。这两个库都只是简单的香草和一点点糖。他们都在争谁的派最甜。但是相信我,最终两者都只是用水烹饪。没有香草上帝,所以不可能没有香草教皇,对吧?

选择最适合你需求的方法。像往常一样。我更喜欢实际实现的回退,而不是固执己见的运行时作弊,但即使是现在,这似乎也是一个品味问题。坚持像http://developer.mozilla.comhttp://caniuse.com这样的质量资源,你就会没事的。

下划线vs LO-Dash by Ben McCormick是比较两者的最新文章:

  1. Lodash的API是Underscore.js的超集。
  1. 在引擎盖下,Lodash已经完全改写。
  1. Lodash绝对不比Underscore.js.慢
  1. Lodash添加了什么?
  • 可用性改进
  • 额外功能
  • 业绩收益
  • 用于链接的速记语法
  • 自定义构建仅使用您需要的内容
  • 语义版本控制和100%代码覆盖率

我刚刚发现了一个对我来说很重要的区别:兼容non-Underscore.js版本的Lodash_.extend()复制了类级别定义的属性或方法。

我在脚本编写中创建了一个茉莉测试来证明这一点:

https://gist.github.com/softcraft-development/1c3964402b099893bd61

幸运的是,lodash.underscore.js保留了Underscore.js复制所有内容的行为,这对我来说是理想的行为。

我不确定这是否是OP的意思,但我遇到了这个问题,因为我正在寻找从Underscore.js迁移到Lodash时必须记住的问题列表。

如果有人发布一篇包含此类差异的完整列表的文章,我将非常感激。让我从我艰难地学到的东西开始(也就是说,让我的代码在生产环境中爆炸的东西:/):

  • Underscore.js中的_.flatten默认为深,你必须将true作为第二个参数来使其浅。在Lodash中,默认为浅,将true作为第二个参数将使其深!:)
  • Underscore.js中的_.last接受第二个参数,该参数告诉您需要多少元素。在Lodash中没有这样的选项。您可以用.slice模拟它
  • _.first(同一问题)
  • Underscore.js中的_.template可以通过多种方式使用,其中之一是提供模板字符串和数据并获取超文本标记语言(或者至少是前段时间的工作方式)。
  • _(something).map(foo)在Underscore.js中有效,但在Lodash中我不得不将其重写为_.map(something,foo)。也许这只是一个TypeScript问题。

在大多数情况下Underscore.js是Lodash的子集。

有时,就像现在一样,Underscore.js会有一些很酷的小功能Lodash没有,比如mapObject。

Lodash得到了_.mapValues(),这与Underscore.js的_.mapObject()相同。

如果,像我一样,你期待Underscore.js和Lodash之间的使用差异列表,有一个从Underscore.js迁移到Lodash的指南

以下是它对后代的当前状态:

  • 下划线_.any是Lodash_.some
  • 下划线_.all是Lodash_.every
  • 下划线_.compose是Lodash_.flowRight
  • 下划线_.contains是Lodash_.includes
  • 下划线_.each不允许通过返回false退出
  • 下划线_.findWhere是Lodash_.find
  • 下划线_.flatten默认为深,而Lodash为浅
  • 下划线_.groupBy支持传递参数(value, index, originalArray)的迭代器,而在Lodash中,_.groupBy的迭代只传递了一个参数:(value)
  • Underscore.js_.indexOf,第三个参数undefined是Lodash_.indexOf
  • Underscore.js_.indexOf,第三个参数true是Lodash_.sortedIndexOf
  • 下划线_.indexBy是Lodash_.keyBy
  • 下划线_.invoke是Lodash_.invokeMap
  • 下划线_.mapObject是Lodash_.mapValues
  • 下划线_.max结合了Lodash_.max_.maxBy
  • 下划线_.min结合了Lodash_.min_.minBy
  • 下划线_.sample结合了Lodash_.sample_.sampleSize
  • 下划线_.object结合了Lodash_.fromPairs_.zipObject
  • 谓词的下划线_.omit是Lodash_.omitBy
  • 下划线_.pairs是Lodash_.toPairs
  • 谓词的下划线_.pick是Lodash_.pickBy
  • 下划线_.pluck是Lodash_.map
  • 下划线_.sortedIndex结合了Lodash_.sortedIndex_.sortedIndexOf
  • iteratee的下划线_.uniq是Lodash_.uniqBy
  • 下划线_.where是Lodash_.filter
  • 下划线_.isFiniteNumber.isFinite不对齐
    (例如_.isFinite('1')在Underscore.js中返回true,但在Lodash中返回false
  • 下划线_.matches速记不支持深度比较
    (例如,_.filter(objects, { 'a': { 'b': 'c' } })
  • 下划线≥1.7&Lodash_.template语法为
    _.template(string, option)(data)
  • Lodash_.memoize缓存与Map类似对象
  • 对于许多支持_.bind的方法,Lodash不支持context参数
  • Lodash支持隐式链接懒惰链接和快捷方式融合
  • Lodash将其重载的_.head_.last_.rest_.initial拆分为
    _.take_.takeRight_.drop
    (即Underscore.js中的_.head(array, 2)是Lodash中的_.take(array, 2)

我同意这里所说的大部分内容,但我只想指出一个支持Underscore.js的论点:图书馆的规模。

特别是如果您正在开发一个打算主要在移动设备上使用的应用程序或网站,生成的捆绑包的大小以及对启动或下载时间的影响可能会起到重要作用。

为了进行比较,这些大小是我在运行Ionic服务后注意到的源代码-地图-资源管理器的大小:

Lodash: 523 kBUnderscore.js: 51.6 kB

可以使用捆绑恐惧症来检查LodashUnderscore.js的当前大小。

它们非常相似,Lodash正在接管…

它们都是一个实用程序库,它采用JavaScript中的实用程序世界…

似乎Lodash现在更新得更频繁了,所以在最新的项目中使用得更多…

Lodash似乎也轻了几个KB…

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

这是每个留档项目的屏幕截图,用于获取数组的第一个值…

Underscore.js:

Underscore.js

Lodash:

Lodash

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

Lodash

Underscore.js