从返回哪些数据的角度来看,调用map方法的方法有什么不同吗?
我希望当我做时
_(object).map(callback);
它导致创建新的下划线类实例,返回的值是下划线的包装
而不是使用
_.map(obj, callback)
使用相同(已创建)的下划线实例,并返回预期的纯JavaScript数组
这取决于情况。如果您从未计划在map()
之前的或之后链接任何函数调用,那么包装该值是没有意义的。另一方面,结构化链可以应用性地转换集合,从而产生紧凑且可读的代码。
根据应用程序的结构,包装器实例可以从一个函数传递到另一个函数,并在此基础上构建。这之所以有效,是因为它们很懒惰,因为在调用value()
之前,链式调用实际上不会运行。
从评估的角度来看,他们也很懒惰。这里有一个关于lodash中懒惰评估的好资源。
在所有情况下,链式语法的结果都与非链式系统相同。
大多数情况下,链接语法只是一种更可读的语法,用于同时执行多个操作。
大多数人发现这种连锁语法:
_(ds)
.groupBy("group")
.map(function(group) {
return _.sample(group, n);
})
.flatten()
.value();
比非链式语法可读性更强:
_.flatten(_.map(_.groupBy(ds), "group", function(group) {
return _.sample(group, n);
}))
但同样,两者都会给你同样的结果。
然而,在lodash中(从3.0版开始),使用链接语法有潜在的性能优势,因为它使用了延迟求值。这意味着它将尽可能多地推迟评估,以最大限度地减少计算结果所需的操作,并减少创建的临时数组的数量。
Adam Boduch链接的关于懒惰评估的文章似乎是一个很好的资源,或者你可以阅读lazy.js的概述,在lodash支持懒惰评估之前,它本质上是lodash/underline的懒惰评估版本。尽管这个已经过时了,但它并没有反映出lodash自编写以来就添加了懒惰的评估。
Undercore最终可能会在其链接语法中添加惰性评估,但我还没有看到任何迹象表明这在他们的路线图上。