为什么有人会更喜欢 lodash.js 要么 underscore.js 实用程序库超过其他?
Lodash似乎是下划线的替代品,后者已经存在了更长时间。
我认为两者都很精彩,但我对他们如何努力进行有根据的比较并不了解,我想更多地了解这些差异。
为什么有人会更喜欢 lodash.js 要么 underscore.js 实用程序库超过其他?
Lodash似乎是下划线的替代品,后者已经存在了更长时间。
我认为两者都很精彩,但我对他们如何努力进行有根据的比较并不了解,我想更多地了解这些差异。
我创建了Lo-Dash,为数组,字符串,对象和数组提供更一致的跨环境迭代支持 arguments
对象1。它已成为Underscore的超集,提供更一致的API行为,更多 特征 (像AMD支持,深度克隆和深度合并),更彻底 文件 和单元测试(在Node,Ringo,Rhino,Narwhal,PhantomJS和浏览器中运行的测试),更好的整体性能和对大型数组/对象迭代的优化,以及更大的灵活性 自定义构建 和模板预编译实用程序。
因为Lo-Dash比Underscore更频繁更新,a lodash underscore
建立 提供 确保与最新稳定版本的Underscore兼容。
有一次,我甚至被给予了 推送访问 到Underscore,部分是因为Lo-Dash负责筹集超过30个问题; Underscore v1.4.x +中的登陆错误修复,新功能和性能提升。
此外,至少有3个Backbone样板,默认包含Lo-Dash,现在Backbone的官方提到了Lo-Dash 文件。
查看Kit Cambridge的帖子, 对Lo-Dash说“你好”,有关Lo-Dash和Underscore之间差异的更深层细分。
脚注:
arguments
对象。在较新的浏览器中,Underscore方法会忽略 数组中的孔,“对象”方法迭代 arguments
对象,字符串被视为类似数组,并且方法正确地迭代函数(忽略它们的“原型”属性)和对象(迭代阴影属性,如“toString”和“valueOf”),而在旧版浏览器中它们则不会。另外,Underscore方法也是如此 _.clone
保留数组中的空洞,而其他人喜欢 _.flatten
别。Lo-Dash的灵感来自下划线,但现在是卓越的解决方案。你可以做你的 自定义构建, 有一个 更高的性能,支持AMD和 很棒的额外功能。检查一下 Lo-Dash vs Underscore基准 在jsperf和..这 关于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)
除了John的回答,还读起lodash(我以前认为它是“me-too”以强调),并看到性能测试,阅读源代码,以及 博客文章,使得lodash远远优于下划线的几点是:
这与速度无关 一致性 速度(?)
如果你看一下下划线的源代码,你会在前几行中看到下划线反映在许多函数的本机实现上。虽然在一个理想的世界中,如果你看一下给定的一些perf链接,这将是一个更好的方法 这些幻灯片,不难得出这些“本机实现”的质量在浏览器到浏览器之间变化很大的结论。 Firefox的一些功能很快,而且在一些Chrome中占主导地位。 (我想在某些场景中IE也会占据主导地位)。我相信最好选择一个代码 性能 在浏览器中更加一致。
请先阅读博客文章,而不是相信它本身,通过运行来判断自己 基准。我现在很震惊,看到一个lodash甚至比下划线快100-150% 简单, 本地人 功能如
Array.every
在Chrome中!
该 演员 在lodash中也很有用。
这里有一个 差异列表 在lodash之间,它的下划线构建是你的下划线项目的替代品。
如果像我一样,你期待下划线和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很浅,默认很深- 下划线
_.isFinite
不符合Number.isFinite
(例如。_.isFinite('1')
回报true
在Underscore但是false
在 Lodash)- 下划线
_.matches
速记不支持深度比较
(例如。_.filter(objects, { 'a': { 'b': 'c' } })
)- 下划线≥1.7&Lodash改变了他们的
_.template
语法到_.template(string, option)(data)
- Lodash
_.uniq
不接受iteratee
像Underscore的功能。使用Lodash_.uniqBy
- Lodash
_.first
和._last
不接受n
像Underscore的论点。使用slice
- Lodash
_.memoize
缓存是Map
喜欢的对象- Lodash支持 隐式链接, 懒惰的链接和快捷方式 聚变
- Lodash分裂了它的重载
_.head
,_.last
,_.rest
,&_.initial
进入
_.take
,_.takeRight
,_.drop
,&_.dropRight
(即_.head(array, 2)
在Underscore是_.take(array, 2)
在Lodash)
这是2014年,而且已经太晚了几年。我仍然认为我的观点是:
恕我直言,这次讨论相当不成比例。引用前面提到的 博客文章:
大多数JavaScript实用程序库,例如Underscore,Valentine和 吴,依靠“原生第一的双重方法。”这种方法更喜欢 本机实现,只有在使用时才能回归到vanilla JavaScript 不支持本机等效。但jsPerf透露了一个有趣的 趋势:迭代数组或类似数组的最有效方法 集合是为了完全避免本机实现,选择 而是简单的循环。
好像“简单循环”和“vanilla Javascript”比Array或Object方法实现更本地化。 Jeez ......
拥有单一的事实来源肯定会很好,但事实并非如此。即使你已经被告知,亲爱的,也没有香草神。对不起。唯一真正成立的假设是我们都在编写旨在在所有主流浏览器中都表现良好的Javascript代码,因为他们都知道所有浏览器都有不同的实现。温和地说,这是一个应对的婊子。但这是前提,无论你喜不喜欢。
也许你们都在研究需要叽叽喳喳表现的大型项目,以便你真正看到差异 每秒在列表上的850,000(下划线)和2,500,000(lodash)迭代之间 马上!
我一个人不是。我的意思是,我工作的项目我必须解决性能问题,但它们从未解决或由Underscore和Lo-Dash引起。除非我抓住实现和性能的真正差异(我们现在正在谈论C ++),让我们说一个循环遍及一个可迭代的(对象或数组,稀疏或不稀疏!),我宁愿不被任何困扰声称基于基准平台的结果 已经自以为是了。
它只需要一个单独的更新,让我们说Rhino以一种方式设置其Array方法实现,而不是一个单独的“中世纪循环方法表现更好,永远和什么不是”牧师可以围绕简单的事实争论他/她的方式所有FF中的突然阵列方法比他/她认为的脑力训练要快得多。伙计,你不能通过欺骗你的运行时环境来欺骗你的运行时环境!在宣传时考虑一下......
你的实用腰带
... 下次。
所以要保持相关性:
选择最适合您需求的方法。照常。我更喜欢在实际的实现上回落而不是固执的运行时作弊,但即便如此,这似乎也是现在的品味问题。坚持像优质资源 http://developer.mozilla.com 和 http://caniuse.com 你会没事的
我同意这里所说的大部分内容,但我只想指出支持underscore.js的论证:图书馆的大小。
特别是在您开发打算主要在移动设备上使用的应用程序或网站时,生成的捆绑包的大小以及对启动或下载时间的影响可能起着重要作用。
为了比较,这些大小是我在运行离子发送后使用source-map-explorer注意到的:
lodash: 523kB
underscore.js: 51.6kb
不确定这是否意味着OP的意思,但我遇到了这个问题,因为我正在搜索从下划线迁移到lodash时必须记住的问题列表。
如果有人发布了一篇包含这些差异的完整列表的文章,我将非常感激。让我从我学到的东西开始(也就是说,使我的代码在生产中爆炸的东西:/):
_.flatten
默认情况下,下划线很深,你必须传递true作为第二个参数才能使它变浅。在lodash中,默认情况下它很浅,并且传递true作为第二个参数将使其变深! :)_.last
在下划线中接受第二个参数,它告诉您需要多少元素。在 lodash
没有这样的选择。你可以用它来模仿 .slice
_.first
(同一期)_.template
在下划线中可以以多种方式使用,其中一种方式是提供模板字符串和数据并获取 HTML
回来(至少那是它以前的工作方式)。在 lodash
您收到一个功能,然后您应该提供数据。_(something).map(foo)
在下划线工作,但在lodash我不得不重写它 _.map(something,foo)
。也许这只是一个 TypeScript
-问题