为什么有人更喜欢Lodash或Underscore.js实用程序库而不是另一个?
Lodash似乎是下划线的替代品,后者存在的时间更长。
我认为两者都很出色,但我不知道它们是如何进行有教育意义的比较的,我想知道更多关于差异的信息。
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.js、RingoJS、犀牛、独角鲸、PhantomJS和浏览器中运行的测试),更好的整体性能和大型数组/对象迭代的优化,以及自定义构建和模板预编译实用程序的更大灵活性。
arguments
因为Lodash比Underscore.js更新更频繁,所以lodash underscore build提供确保与最新稳定版本的Underscore.js.兼容
lodash underscore
有一次,我甚至被Underscore.js0,部分原因是Lodash负责提出30多个问题;在Underscore.jsv1.4. x+中登陆bug修复、新功能和性能提升。
此外,至少有三个Backbone.js样板默认包含Lodash,Lodash现在在Backbone.js的官方留档中被提及。
查看Kit Cambridge的帖子对Lo-Dash说"你好",了解Lodash和Underscore.js.之间的差异
脚注:
_.clone
_.flatten
除了博客文章3898916">约翰的回答,阅读Lodash(迄今为止我一直认为这是Underscore.js的“我也是”),查看性能测试,阅读源代码和博客文章,使Lodash优于Underscore.js的几点是:
如果你查看Underscore.js的源代码,你会在开头几行中看到Underscore.js许多函数的原生实现。尽管在理想情况下,这会是一个更好的方法,但如果你查看这些幻灯片中给出的一些性能链接,就不难得出结论,这些“原生实现”的质量在浏览器之间有很大差异。Firefox在某些功能上非常快,在某些Chrome占据主导地位。(我想在某些情况下Internet Explorer也会占据主导地位)。我认为最好选择性能在浏览器之间更一致的代码。
一定要早点读这篇博文,而不是相信它,通过运行的基准来判断自己。我现在很震惊,看到Lodash在简单、本地函数中的表现比Underscore.js快100-150%,比如Chrome中的Array.every!
Array.every
这是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中的突然数组方法比他/她自以为是的大脑要快得多。伙计,你不能通过欺骗你的运行时环境来欺骗你的运行时环境!在推广…
你的多功能腰带
…下次。
为了保持相关性:
选择最适合你需求的方法。像往常一样。我更喜欢实际实现的回退,而不是固执己见的运行时作弊,但即使是现在,这似乎也是一个品味问题。坚持像http://developer.mozilla.com和http://caniuse.com这样的质量资源,你就会没事的。
下划线vs LO-Dash by Ben McCormick是比较两者的最新文章:
Lodash的API是Underscore.js的超集。
在引擎盖下,Lodash已经完全改写。
Lodash绝对不比Underscore.js.慢
Lodash添加了什么?
可用性改进额外功能业绩收益用于链接的速记语法自定义构建仅使用您需要的内容语义版本控制和100%代码覆盖率
我刚刚发现了一个对我来说很重要的区别:兼容non-Underscore.js版本的Lodash_.extend()复制了类级别定义的属性或方法。
_.extend()
我在脚本编写中创建了一个茉莉测试来证明这一点:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
幸运的是,lodash.underscore.js保留了Underscore.js复制所有内容的行为,这对我来说是理想的行为。
lodash.underscore.js
我不确定这是否是OP的意思,但我遇到了这个问题,因为我正在寻找从Underscore.js迁移到Lodash时必须记住的问题列表。
如果有人发布一篇包含此类差异的完整列表的文章,我将非常感激。让我从我艰难地学到的东西开始(也就是说,让我的代码在生产环境中爆炸的东西:/):
_.last
.slice
_.first
_.template
_(something).map(foo)
_.map(something,foo)
TypeScript
在大多数情况下Underscore.js是Lodash的子集。
有时,就像现在一样,Underscore.js会有一些很酷的小功能Lodash没有,比如mapObject。
Lodash得到了_.mapValues(),这与Underscore.js的_.mapObject()相同。
_.mapValues()
_.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_.indexOfUnderscore.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和_.sortedIndexOfiteratee的下划线_.uniq是Lodash_.uniqBy下划线_.where是Lodash_.filter下划线_.isFinite与Number.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))
_.any
_.some
_.all
_.every
_.compose
_.flowRight
_.contains
_.includes
_.each
false
_.findWhere
_.find
_.groupBy
(value, index, originalArray)
(value)
_.indexOf
undefined
true
_.sortedIndexOf
_.indexBy
_.keyBy
_.invoke
_.invokeMap
_.mapObject
_.mapValues
_.max
_.maxBy
_.min
_.minBy
_.sample
_.sampleSize
_.object
_.fromPairs
_.zipObject
_.omit
_.omitBy
_.pairs
_.toPairs
_.pick
_.pickBy
_.pluck
_.map
_.sortedIndex
iteratee
_.uniq
_.uniqBy
_.where
_.filter
_.isFinite
Number.isFinite
_.isFinite('1')
_.matches
_.filter(objects, { 'a': { 'b': 'c' } })
_.template(string, option)(data)
_.memoize
Map
_.bind
context
_.head
_.rest
_.initial
_.take
_.takeRight
_.drop
_.head(array, 2)
_.take(array, 2)
我同意这里所说的大部分内容,但我只想指出一个支持Underscore.js的论点:图书馆的规模。
特别是如果您正在开发一个打算主要在移动设备上使用的应用程序或网站,生成的捆绑包的大小以及对启动或下载时间的影响可能会起到重要作用。
为了进行比较,这些大小是我在运行Ionic服务后注意到的源代码-地图-资源管理器的大小:
Lodash: 523 kBUnderscore.js: 51.6 kB
可以使用捆绑恐惧症来检查Lodash和Underscore.js的当前大小。
它们非常相似,Lodash正在接管…
它们都是一个实用程序库,它采用JavaScript中的实用程序世界…
似乎Lodash现在更新得更频繁了,所以在最新的项目中使用得更多…
Lodash似乎也轻了几个KB…
两者都有很好的API和留档,但我认为Lodash更好…
这是每个留档项目的屏幕截图,用于获取数组的第一个值…
Underscore.js:
Lodash:
由于事情可能会不时更新,只需检查他们的网站也…
Lodash
Underscore.js