为什么有人更喜欢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缓存是Maplike 对象- Lodash 支持隐式链接 , 懒惰链接和快捷方式融合
- Lodash 将重载的
_.head,_.last._.rest,_.last._.rest和_.initial为
_.take,_.takeRight._.take,_.takeRight._.drop,&_.dropRight
(即_.head(array, 2)在_.take(array, 2)中是_.take(array, 2))