【问题标题】:What is the preferred way of chaining Underscore.js functions?链接 Underscore.js 函数的首选方式是什么?
【发布时间】:2012-03-08 23:10:32
【问题描述】:

Underscore.js 有两种调用函数的方式,我将其称为对象样式和函数样式。对象样式如下所示:

_(myObject).each(function (val, key) {
  console.log(key, val);
});

另一方面,函数样式看起来像这样:

_.each(myObject, function (val, key) {
  console.log(key, val);
});

我很高兴在我的代码中使用对象样式调用,但是在某些时候,调用的对象样式从 underscore.js 文档中消失了(尽管对象样式调用仍然可以正常工作)。我还看到了有关函数样式“更好”或“首选”的地方的提示(例如在主干.js 文档中)。

那么,调用的函数风格是首选方法吗?如果是这样,有人可以解释这背后的原因吗?

更新: @ggozad 部分回答了我的问题。但似乎我对 underscore.js 工作原理的理解是在 0.4.2 版左右形成的。阅读 underscore.js 的更改历史,您可以看到 1.2.4 版本的以下条目:

您现在可以(并且可能应该)写 _.chain(list) 而不是 _(list).chain()

我想知道为什么你应该写_.chain(list) 而不是_(list).chain()

【问题讨论】:

  • _(list).chain() 内部计算类似于_.chain(_(list).value())_(list).value() === list。因此调用_.chain(list) 更快

标签: javascript coding-style underscore.js


【解决方案1】:

@ggozad 的回答实际上非常具有误导性。面向对象的风格与链接无关。给出的例子:

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});

实际上根本没有使用下划线链接!它之所以有效,是因为内置的 JS 数组对象有它自己的 map() 函数。尝试一个非内置函数(如 shuffle),你会发现它坏了:

_([1,2,3]).shuffle().shuffle();

获得下划线链接的唯一方法是调用chain(),您可以使用任一样式(OO 或函数式)来完成。

至于为什么文档说你应该使用_.chain,我猜这只是一种风格偏好。我已经打开了issue at GitHub 进行澄清。

【讨论】:

  • 只是想法:整个文档都基于使用函数。您只会在链接部分下找到面向对象的表示法,并且只有在您知道在哪里寻找它的情况下才能找到它。而且面向对象表示法和调用 _.chain 的区别还是很容易忽略的。
  • ggozad 的回答完全是错误_ 不会产生可链接的包装对象。只有_.chain 这样做。 _.chain 不返回数组或任何原生 JS 对象。它返回一个 monad,您需要调用 value 才能访问其内容。
  • 确实 _() 没有在下划线中链接,但它确实在 lodash 中链接。
【解决方案2】:

_ 用作函数时,它本质上包装了参数。包装器提供了所有普通下划线函数。

它与样式不同的是,使用 OOP 样式(或定义中的对象样式)是它生成可链接的包装对象。所以很容易做到:

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});

相当于:

_.map(_.map([1,2,3], function (item) { return item * 2 }), function (item) { return item * 3 });

这可能不太清楚。

【讨论】:

  • 谢谢。重新阅读文档,它就在那里,但有点令人困惑。那么,如果是这种情况,那么链接的首选方法是什么?应该使用_.chain() 函数还是OOP 风格的调用?更改历史记录显示“您现在可以(并且可能应该)写 _.chain(list) 而不是 _(list).chain()。”但没有解释原因。
  • 当我需要链接时,我更喜欢 OOP 风格。否则我坚持功能。我认为这是风格和一致性的问题。
  • 第一个例子应该是_.chain([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;}).value();,否则它与第二个例子不等价
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多