请解释下划线.js的_.identity(value)的用法

时间:2013-01-08 13:55:25

标签: javascript underscore.js

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

您能提供一些使用示例吗?

3 个答案:

答案 0 :(得分:36)

涉及身份的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是一种必要的结构,例如,汇编,而在函数式编程中,它就像其他函数一样,它返回一个值。如果身份是NOOP,那么所有纯函数也可以被认为是noop,这不是一个明智的事情。

答案 1 :(得分:13)

它本质上是一种无操作功能。它返回传入其中的任何值。

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

答案 2 :(得分:10)

具体示例:

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);