为什么有些人更喜欢使用Lodash或Underscore.js实用工具库?
Lodash似乎是Underscore的替代品,但后者已经存在更长时间。
我认为两者都很出色,但我不了解它们的工作原理,无法做出有根据的比较,我想了解它们之间的区别。
为什么有些人更喜欢使用Lodash或Underscore.js实用工具库?
Lodash似乎是Underscore的替代品,但后者已经存在更长时间。
我认为两者都很出色,但我不了解它们的工作原理,无法做出有根据的比较,我想了解它们之间的区别。
因为Lodash的更新频率比Underscore.js更高,因此提供了一个lodash underscore
构建版本以确保兼容最新稳定版本的Underscore.js。
曾经我甚至被授予推进访问权限到Underscore.js, 部分原因是因为Lodash负责解决超过30个问题;在Underscore.js v1.4.x +中实现了错误修复,新功能和性能提升。
此外,至少有三个Backbone.js样板文件默认包含Lodash,并且Lodash现在在Backbone.js的官方文档中被提及。
查看Kit Cambridge的文章,Say "Hello" to Lo-Dash,深入了解Lodash和Underscore.js之间的区别。
注释:
arguments
对象的支持不一致。在较新的浏览器中,Underscore.js方法忽略数组中的空洞,“对象”方法迭代arguments
对象,字符串被视为类似数组的对象,方法正确地迭代函数(忽略它们的“prototype”属性)和对象(迭代像“toString”和“valueOf”这样的遮蔽属性),而在旧版浏览器中则不会。此外,Underscore.js方法(如_.clone
)保留数组中的空洞,而其他方法(如_.flatten
)则不会。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 }]
characters.filter(x=>x.age==36) //pure js
- Alex Szücsx
作为变量名,更推荐使用 character
以增加描述性。 - neiker_.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)
undefined
的_.indexOf
对应Lodash的_.indexOf
true
的_.indexOf
对应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
结合在一起_.uniq
通过迭代器与Lodash的_.uniqBy
相同_.where
是Lodash的_.filter
_.isFinite
与Number.isFinite
不匹配_.isFinite('1')
在Underscore.js中返回true
,但在Lodash中返回false
)_.matches
简写不支持深度比较_.filter(objects, { 'a': { 'b': 'c' } })
)_.template
语法为_.template(string, option)(data)
_.memoize
缓存使用类似 Map
的对象context
参数,而是支持 _.bind
_.head
、_.last
、_.rest
和 _.initial
拆分成_.take
、_.takeRight
、_.drop
和 _.dropRight
_.head(array, 2)
相当于 Lodash 中的 _.take(array, 2)
)除了John的答案,并且阅读了有关Lodash的信息(我之前一直认为这是一个对Underscore.js的模仿),观看了性能测试、阅读了源代码以及博客文章,使Lodash比Underscore.js更卓越的几点如下:
如果你查看Underscore.js的源代码,你会在最前面的几行看到Underscore.js回退到许多函数的本机实现。虽然在理想情况下,这可能是一个更好的方法,但是如果你查看这些幻灯片中提供的一些性能链接,很容易得出结论,这些“本机实现”的质量在浏览器之间变化很大。Firefox在某些功能上非常快,而Chrome在某些功能上占优势。(我想在某些场景下Internet Explorer也会占优势)。我认为最好选择一个在各种浏览器中性能更加一致的代码。
请阅读之前的博客文章,不要因为我的缘故而相信它,请自己运行基准测试来判断。我现在感到震惊,甚至在Chrome的
Array.every
等简单的本机函数中,看到Lodash的性能比Underscore.js快100-150%!
这里是Lodash和Underscore.js之间的差异列表,它的Underscore.js构建是您现有项目的替代品。
在2014年,我仍然认为我的观点是正确的:
我个人认为,这次讨论有些过度了。引用上述博客文章中的话:
大多数JavaScript实用程序库(如Underscore、Valentine和wu)都依赖于“本地优先双重方法”。这种方法优先选择本地实现,仅在本地等效物不受支持时才回退到原始JavaScript。但是jsPerf揭示了一个有趣的趋势:遍历数组或类似数组的集合的最有效方法是完全避免使用本地实现,而是选择简单的循环。
好像“简单循环”和“原始JavaScript”比Array或Object方法的实现更本地化。天啊...
"虽然拥有一个统一的真相来源会很好,但实际上并不存在。即使有人告诉你有一个“香草神”,亲爱的,我很抱歉,但这是不可能的。唯一能够成立的假设是我们都在编写 JavaScript 代码,并且希望在所有主要浏览器中都能够表现良好,尽管它们对同样的东西有不同的实现方式。说实话,这是一件非常麻烦的事情。但这就是前提,无论你喜欢与否。"选择最适合您需求的方法。通常情况下,我更喜欢实际实现上的回退而不是有偏见的运行时欺骗,但即使这也似乎是一种口味问题。坚持使用像http://developer.mozilla.com和http://caniuse.com这样的优质资源,您就会没问题。
Array.from
的问题,他们可能甚至不知道它应该做什么。JS“实用工具”人似乎过分关注推广他们那些聪明绝顶的解决方案,以至于他们往往忘记了这样做实际上会稀释标准化过程。没有功能需求就没有对浏览器“制造商”的压力。有趣的事实是:4个主要浏览器中的2个基于开源项目([1](http://www.chromium.org/),[2](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Source_Code/Mercurial))。 - Lukas Bünger我同意这里说的大部分事情,但我想指出支持Underscore.js的一个论点:库的大小。
特别是在你开发的应用或网站主要在移动设备上使用的情况下,生成包的大小和对启动或下载时间的影响可能会起重要作用。
为了比较,这些是我在运行Ionic serve后注意到的大小:
Lodash: 523 kB
Underscore.js: 51.6 kB
使用BundlePhobia可以检查当前Lodash和Underscore.js的大小。
ionic serve
后使用source-map-explorer
。 - David Dal Busco我不确定OP是什么意思,但我遇到了这个问题,因为我正在寻找从Underscore.js迁移到Lodash时需要记住的问题清单。
如果有人发布了一篇完整的差异列表文章,我将不胜感激。让我从我已经学到的(也就是那些使我的代码在生产环境中崩溃的事情:/)开始:
_.flatten
在Underscore.js中默认为深层次,你必须传递true作为第二个参数来使其变浅。在Lodash中,默认为浅层次,并且传递true作为第二个参数会使其变得深层次! :)_.last
在Underscore.js中接受第二个参数,用于告诉您要多少个元素。在Lodash中没有这样的选项。您可以使用.slice
来模拟这个功能。_.first
(同样的问题)_.template
在Underscore.js中有多种用法之一是提供模板字符串和数据并获取HTML回来(或者至少以前是这样的)。在Lodash中,您将收到一个函数,然后应该将其与数据一起使用。_(something).map(foo)
在Underscore.js中起作用,但在Lodash中,我不得不将其重写为_.map(something,foo)
。也许这只是一个TypeScript问题。_(something).map(foo).value()
这样的终端点。 - Brian M. HuntUnderscore vs Lo-Dash是本·麦考密克最新的一篇比较这两个库的文章:
- Lodash的API是Underscore.js的超集。
- 在底层,Lodash已经完全重写。
- Lodash绝对不会比Underscore.js更慢。
- Lodash添加了什么?
- 增强的可用性
- 额外的功能
- 性能提升
- 链接语法的速记语法
- 自定义构建只使用所需内容
- 语义化版本控制和100%代码覆盖率
_.extend()
不会复制类级别定义的属性或方法。https://gist.github.com/softcraft-development/1c3964402b099893bd61
幸运的是,lodash.underscore.js
保留了 Underscore.js 复制所有内容的行为,而对于我的情况来说,这是期望的行为。
Lodash 提供了 _.mapValues()
方法,该方法与 Underscore.js 的 _.mapObject()
方法完全相同。
lodash
和underscore
正在合并线程下。 - zangw