24

请解释_.identity(value)下划线.js 的用法。无法从文档(http://underscorejs.org/#identity)中理解它。

你能提供一些它的用法例子吗?

4

3 回答 3

43

一个涉及身份的 JavaScript 代码模式是根据真实性过滤值,例如

var a = [null, null, [1,2,3], null, [10, 12], null];

a.filter(_.identity) 

产生 [Array[3], Array[2]]。

使用

_.compact(a)

更清晰,但可能根本不使用 lodash 或下划线,例如

function identity(x) { 
   return x; 
}

a.filter(identity)

出于几个原因,它是否是一个好的代码模式值得怀疑,但它正在被广泛使用。

这根本不是 NOOP。NOOP 在例如汇编中是一种命令式构造,而在函数式编程中,它与其他函数一样返回一个值。如果 identity 是 NOOP,那么所有的纯函数也可以被认为是 noop,这不是一件明智的事情。

于 2014-09-14T09:08:48.797 回答
14

它本质上是一个无操作功能。它返回传递给它的任何值。

关于它在库本身中用作“默认迭代器”的部分意味着在其他可能具有可选“迭代器”参数的函数中(可能用作应用于某种数组的每个元素的函数) ,如果没有传递迭代器参数,库将使用这个“无操作”迭代器,并且数组的元素将保持不变。

于 2013-01-08T13:59:47.593 回答
13

一个具体的例子:

Underscore.js 定义了 _.each ,就像这样。

_.each = function(obj, iterator, context) {
  ...
}

此迭代器显示 el 值。你可能用过这个成语。

_.each([1, 2, 3], function(el){
  console.log(el);
});

此迭代器返回 el 值而不作任何更改。

_.each([1, 2, 3], function(el){
  return el;
});

返回值不变的函数经常出现。所以 Underscore.js 想要定义函数。Underscore.js 将函数命名为 _.identity。

_.identity = function(value) {
  return value;
};

如果 Underscore.js 想要使用默认迭代器,Underscore.js 只需要调用 _.identity。

_.each([1, 2, 3], _.identity);
于 2014-08-14T04:05:35.970 回答