lodash和下划线之间的差异[关闭]

2020/09/16 07:31 · javascript ·  · 0评论

为什么有人会比其他人更喜欢lodash.jsunderscore.js实用程序库?

Lodash似乎是下划线的替代品,下划线的使用时间更长。

我认为两者都很出色,但是我对它们的工作方式还不够了解,无法进行有根据的比较,我想进一步了解它们之间的差异。

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

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

有一次我什至获得了推送访问 Underscore的权限,部分原因是Lo-Dash负责提出30多个问题。Underscore v1.4.x +中的着陆错误修复,新功能和性能提升。

此外,至少有3个Backbone样板默认包含Lo-Dash,并且Back-Bone的官方文档中现在提到了Lo-Dash

查看Kit Cambridge的帖子,向Lo-Dash说“你好”,以深入了解Lo-Dash和Underscore之间的区别。

脚注:

  1. 下划线对数组,字符串,对象和arguments对象的支持不一致在较新的浏览器中,Underscore方法将忽略数组中的孔,“ Objects”方法将迭代arguments对象,将字符串视为类似于数组的方法,并且方法将正确地迭代函数(忽略其“ prototype”属性)和对象(迭代阴影的属性,例如“ toString”和“ valueOf”),而在较旧的浏览器中则不会。同样,下划线方法(例如)_.clone保留数组中的孔,而其他方法_.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

这是后代的当前状态:

  • 下划线_.any是Lodash_.some
  • 下划线_.all是Lodash_.every
  • 下划线_.compose是Lodash_.flowRight
  • 下划线_.contains是Lodash_.includes
  • 下划线_.each不允许通过返回退出false
  • 下划线_.findWhere是Lodash_.find
  • _.flatten默认情况下,下划线为深,而Lodash为浅
  • 下划线_.groupBy支持传递的参数的iteratee (value, index, originalArray),而在Lodash,对于iteratee _.groupBy仅通过一个参数:(value)
  • _.indexOf带第三个参数的下划线undefined是Lodash_.indexOf
  • _.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
  • 下划线_.uniqiteratee是Lodash_.uniqBy
  • 下划线_.where是Lodash_.filter
  • 下划线_.isFinite不符合Number.isFinite

    (例如
    ,下划线中的
    _.isFinite('1')返回值true,但false在Lodash中返回
  • 下划线的_.matches简写不支持深度比较

    (例如
    _.filter(objects, { 'a': { 'b': 'c' } })
  • 下划线≥1.7&Lodash _.template语法为
    _.template(string, option)(data)
  • Lodash _.memoize缓存Map就像对象
  • Lodash不支持context许多方法参数来支持_.bind
  • Lodash支持隐式链接惰性链接和快捷方式融合
  • Lodash拆分它的过载_.head_.last_.rest,和_.initial伸到
    _.take_.takeRight_.drop,和_.dropRight

    (即
    _.head(array, 2)在下划线是_.take(array, 2)在Lodash)

除了John的回答之外,还阅读了lodash(到目前为止,我将其视为下划线的“我也很想”),并查看了性能测试,阅读了源代码和博客文章,这是使lodash变得更重要的几点。这些要比下划线要好得多:

  1. 这不关乎速度,而是关乎速度的一致性(?)

    如果查看下划线的源代码,您会在前几行中看到下划线是许多功能的本机实现的基础。尽管在理想情况下,这本来是一种更好的方法,但是如果您看一下这些幻灯片中提供的一些性能链接,则不难得出这样的结论:这些“本机实现”的质量在很多浏览器中都不同,浏览器。Firefox在某些功能上非常快速,在某些Chrome中占主导地位。(我想在某些情况下IE也将占主导地位)。我相信最好选择一种性能在各个浏览器之间更一致的代码

    一定要早点阅读该博客文章,而不是为了它而相信它,而是通过运行基准来自己判断我现在被惊呆了,看到即使在简单的原生功能(例如Array.everyChrome)中lodash的执行速度也比下划线快100-150%

  2. lodash 附加功能也非常有用。

  3. 至于Xananax极力支持的评论,暗示了对下划线代码的贡献:拥有GOOD竞争总是更好,这不仅可以保持创新,还可以驱使您(或您的图书馆)保持良好状态。

这是lodash之间差异列表,并且underscore-build是下划线项目的直接替代品。

这是2014年,并且为时已晚。我仍然认为我的观点是正确的:

恕我直言,这种讨论不成比例。引用上述博客文章

大多数JavaScript实用程序库(例如Underscore,Valentine和wu)都依赖于“本地优先双重方法”。这种方法更喜欢本机实现,只有在不支持本机等效功能时,才使用原始JavaScript。但是jsPerf揭示了一个有趣的趋势:遍历数组或类似数组的集合的最有效方法是完全避免本机实现,而是选择简单的循环。

好像“简单循环”和“原始Javascript”比Array或Object方法实现更原生。哎呀...

有一个单一的真理来源当然会很好,但事实并非如此。亲爱的,即使有人告诉您,也没有香草神。对不起。真正成立的唯一假设是,我们都在编写旨在在所有主要浏览器中都表现良好的Javascript代码,因为他们知道所有这些浏览器都有相同的事物的不同实现。温和地说,这是一个应付的bit子。但这是前提,无论您是否喜欢。

也许你们所有人都在从事需要微调性能的大型项目,所以您现在可以在每秒列表上真正看到850,000(下划线)与2,500,000(lodash)迭代之间的差异

我不是一个。我的意思是,我在必须解决性能问题的项目中工作,但是这些问题从未解决过,也不是由Underscore或Lo-Dash引起的。而且,除非我掌握了实现和性能的真正差异(我们现在正在谈论C ++),让我们说一个遍历可迭代对象(对象或数组,稀疏与否)的循环,否则我不会被任何麻烦基于这样的基准平台的结果,声称已经固执己见

它只需要更新一次,比如说Rhino,就可以以一种方式使Array方法的实现着火,这种方式不会让任何一个“中世纪循环方法表现得更好,永无止境”,牧师可以围绕这样一个简单的事实争论自己的方式: FF中的突然排列方法比他/她自以为是的头脑快得多。伙计,您只是不能通过欺骗运行时环境来欺骗运行时环境!推广时考虑一下...

你的腰带

... 下次。

因此,保持相关性:

  • 如果您在不牺牲本机语言的情况下方便使用,请使用Underscore。
  • 如果您方便使用并且喜欢它的扩展功能目录(深拷贝等),并且急需即时性能,并且最重要的是,不要在原生API出现问题后立即解决替代方案,请使用Lo-Dash固执己见的工作环境。这将很快发生。期。
  • 甚至还有第三种解决方案。DIY!了解您的环境。了解不一致之处。阅读他们的(John-DavidJeremy的)代码。在无法解释为什么确实需要一致性/兼容性层并增强您的工作流程或提高应用程序性能的情况下,请不要使用此功能。一个非常有能力自己编写的简单polyfill很有可能满足您的要求。这两个库都是纯香草味的,并带有一点点糖。他们俩都在争夺谁在为最甜蜜的派服务但是请相信我,最终两者都只用水煮。没有香草神,所以就没有香草教皇,对吗?

选择最适合您需求的方法。照常。我宁愿随时随地以实际的实现作为后备,而不是固执己见的运行时作弊手段,但即使现在看来,这也是一个问题。坚持使用http://developer.mozilla.comhttp://caniuse.com之类的优质资源,一切都会好起来的。

我同意这里所说的大多数内容,但我只想指出一个支持underscore.js的论点:库的大小。

特别是在您开发打算主要在移动设备上使用的应用程序或网站的情况下,所得捆绑包的大小以及对启动或下载时间的影响可能会发挥重要作用。

为了进行比较,这些大小是我在运行离子服务后通过source-map-explorer注意到的大小:

lodash: 523kB
underscore.js: 51.6kb

2020年2月编辑

人们可以使用BundlePhobia检查的当前大小罗短跑下划线

不知道这是否是OP的意思,但是我遇到了这个问题,因为我在搜索从下划线迁移到lodash时必须牢记的问题列表。

如果有人发布了包含此类差异的完整列表的文章,我将不胜感激。让我从我艰难学习的东西开始(即使我的代码在生产中爆炸的东西:/):

  • _.flatten下划线默认是深的,您必须将true作为第二个参数传递以使其变浅。在lodash中,默认情况下它是浅的,并且传递true作为第二个参数将使其变深!:)
  • _.last下划线中的in接受第二个参数,该参数告诉您要多少个元素。lodash没有这样的选项。您可以使用.slice
  • _.first (同一期)
  • _.template下划线中的可以有多种使用方式,其中一种是提供模板字符串和数据并HTML取回(或者至少是一段时间前的工作方式)。lodash其中,您将收到一个函数,然后应将其提供给数据。
  • _(something).map(foo)在下划线下工作,但在lodash中我不得不将其重写为_.map(something,foo)也许那只是一个TypeScript问题

http://benmccormick.org/2014/11/12/underscore-vs-lodash/

Ben McCormick的最新文章比较了两者:

  1. Lo-Dash的API是Underscore的超集。

  2. 引擎盖下的[Lo-Dash]已被完全重写。

  3. Lo-Dash绝对不比Underscore慢。

  4. Lo-Dash添加了什么?

    • 可用性改进
    • 额外功能
    • 绩效提升
    • 链接的简写语法
    • 自定义构建仅使用您需要的内容
    • 语义版本控制和100%的代码覆盖率

我只是发现一个差异,最终对我来说很重要。lodash的的非下划线兼容的版本_.extend()没有拷贝过来的类级定义的属性或方法。

我已经在CoffeeScript中创建了一个Jasmine测试,以证明这一点:

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

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

lodash已经得到了_.mapValues()它等同于underescore的_.mapObject()

大多数情况下,下划线是lodash的子集。有时,像现在的下划线一样,会有一些很棒的小功能,而lodash却不像mapObject。这为我节省了很多时间来开发项目。

它们非常相似,Lodash接管了...

它们都是实用程序库,它们利用JavaScript的实用程序领域...

似乎Lodash现在正在定期更新,因此在最新项目中使用了更多...

此外Lodash似乎是一对夫妇KB的打火机......

两者都有很好的api和doc,但是我认为Lodash更好。

这是每个文档的屏幕快照,用于获取数组的第一个值...

下划线:

下划线

lodash:
Lodash

由于事情可能会不时更新,因此只需检查其网站即可。

Lodash

下划线

本文地址:http://javascript.askforanswer.com/lodashhexiahuaxianzhijiandechayiguanbi.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!