为什么有人更喜欢lodash.js或underscore.js实用程序库而不是另一个?
Lodash 似乎是下划线的替代品,后者已经存在了更长时间。
我认为两者都很精彩,但我对他们如何努力进行有根据的比较并不了解,我想更多地了解这些差异。
我创建了 Lo-Dash,为数组,字符串,对象和arguments
对象1提供更一致的跨环境迭代支持。它已成为 Underscore 的超集,提供更一致的 API 行为,更多功能 (如 AMD 支持,深度克隆和深度合并),更全面的文档和单元测试(在 Node,Ringo,Rhino,Narwhal,PhantomJS 中运行的测试)和浏览器),更好的整体性能和大型数组 / 对象迭代的优化,以及自定义构建和模板预编译实用程序的更大灵活性。
由于 Lo-Dash 比lodash underscore
更新频繁, 因此提供了lodash underscore
构建,以确保与最新稳定版本的lodash 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 方法忽略数组中的漏洞 ,“Objects” 方法迭代arguments
对象,字符串被视为类似数组,方法正确迭代函数(忽略它们的 “原型” 属性)和对象(迭代阴影属性,如 “toString”)和 “valueOf”),而在较旧的浏览器中他们不会。此外,像_.clone
这样的_.clone
方法_.clone
保留数组中的漏洞,而像_.flatten
这样的其他_.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 的指南 。
以下是后人的当前状态:
- 下划线
_.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')
在 Underscore 中返回true
但在 Lodash 中返回false
)- 下划线
_.matches
简写不支持深度比较
(例如_.filter(objects, { 'a': { 'b': 'c' } })
)- Underscore≥1.7&Lodash 已将其
_.template
语法更改为
_.template(string, option)(data)
- Lodash
_.uniq
不接受像iteratee
那样的iteratee
函数。使用 Lodash_.uniqBy
- Lodash
_.first
和._last
不接受像._last
那样的n
参数。使用slice
- Lodash
_.memoize
缓存是Map
like 对象- Lodash 支持隐式链接 , 懒惰链接和快捷方式融合
- Lodash 将重载的
_.head
,_.last
._.rest
,_.last
._.rest
和_.initial
为
_.take
,_.takeRight
._.take
,_.takeRight
._.drop
,&_.dropRight
(即_.head(array, 2)
在_.take(array, 2)
中是_.take(array, 2)
)