Lodash与Underscore.js的差异对比

Lodash与Underscore.js的差异对比

技术背景

在JavaScript开发中,Lodash和Underscore.js都是非常知名的实用工具库,它们提供了大量方便的函数,帮助开发者更高效地处理数组、对象、字符串等数据。Underscore.js出现较早,Lodash则是受其启发而创建的,后来逐渐发展成为Underscore.js的超集。

实现步骤

Lodash的优势

  1. 更一致的跨环境迭代支持:Underscore.js对数组、字符串、对象和arguments对象的支持不一致,而Lodash提供了更一致的支持。例如,在不同浏览器中,Underscore.js方法对数组空洞的处理不一致,而Lodash解决了这些问题。
  2. 更丰富的功能:Lodash提供了更多的功能,如AMD支持、深度克隆和深度合并等。
  3. 更完善的文档和测试:Lodash有更详细的文档,并且有全面的单元测试,这些测试可以在Node.js、RingoJS、Rhino、Narwhal、PhantomJS和浏览器中运行。
  4. 更好的性能:Lodash在大型数组和对象迭代方面有更好的性能和优化,并且性能在不同浏览器中更一致。
  5. 更灵活的自定义构建:Lodash支持自定义构建,可以根据需要选择使用的功能,减少打包体积。

两者的使用差异

  1. 方法命名差异:例如,Underscore的_.any对应Lodash的_.some;Underscore的_.all对应Lodash的_.every等。
  2. 方法行为差异
    • _.flatten:Underscore.js默认是深度扁平化,而Lodash默认是浅扁平化。
    • _.each:Underscore的_.each不允许通过返回false来退出迭代。
    • _.groupBy:Underscore支持传递(value, index, originalArray)参数的迭代器,而Lodash的迭代器只传递(value)参数。

核心代码

以下是使用_.filter方法的示例,展示了Lodash的简写语法和Underscore.js的常规用法:

1
2
3
4
5
6
7
8
9
10
11
12
var characters = [
{ 'name': 'barney', 'age': 36, 'blocked': false },
{ 'name': 'fred', 'age': 40, 'blocked': true }
];

// 使用Lodash的 _.filter 简写语法
_.filter(characters, { 'age': 36 });

// 使用Underscore.js
_.filter(characters, character => character.age === 36);

// 结果: [{ 'name': 'barney', 'age': 36, 'blocked': false }]

最佳实践

选择Lodash的场景

  • 当需要处理大型数组或对象,并且对性能有较高要求时,Lodash是更好的选择,因为它在性能上更稳定且有优化。
  • 如果需要使用一些高级功能,如深度克隆、深度合并等,Lodash提供了这些功能。
  • 对于需要频繁更新和维护的项目,Lodash更新更频繁,能提供更好的支持。

选择Underscore.js的场景

  • 如果项目对文件大小敏感,特别是在移动设备上开发应用或网站,Underscore.js的文件大小更小(Lodash约523 kB,Underscore.js约51.6 kB)。
  • 对于一些简单的项目,只需要基本的实用功能,Underscore.js已经足够满足需求。

常见问题

迁移问题

从Underscore.js迁移到Lodash时,需要注意以下一些方法的差异:

  • _.flatten:在Underscore.js中默认是深度扁平化,需要传递true作为第二个参数来实现浅扁平化;而在Lodash中默认是浅扁平化,传递true作为第二个参数将实现深度扁平化。
  • _.last_.first:Underscore.js中可以接受第二个参数来指定获取的元素数量,而Lodash中没有这个选项,可以使用.slice方法来模拟。
  • _.template:在Underscore.js中可以直接传入模板字符串和数据获取HTML,而在Lodash中会返回一个函数,需要再传入数据调用该函数。

兼容性问题

Lodash的非Underscore.js兼容版本的_.extend()不会复制类级别的属性或方法,而lodash.underscore.js会保留Underscore.js的行为。