请解释下划线.js _.identity(value)
的用法。无法从文档中了解它(http://underscorejs.org/#identity)。
您能提供一些使用示例吗?
答案 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);