2013-01-08 45 views

回答

9

它本質上是一個沒有操作功能。它會返回傳遞給它的值。

關於它的部分在庫本身中用作「默認迭代器」意味着在其他函數中可能有一個可選的「迭代器」參數(它可能用作函數應用於數組的每個元素如果沒有迭代器參數傳遞,庫將使用這個「no-op」迭代器,而數組的元素將保持不變。

+4

貪圖:你可以看到這個空操作,在[註釋源代碼(http://underscorejs.org/docs/underscore.html#section-118)。 –

+0

@DanLee,我不能將評論標記爲答案。 – SunnyShah

+0

@SunnyShah這不是我的回答,只是我的評論。我認爲你可以在幾分鐘內從馬特馬上回答他的答案。 –

9

一個具體的例子:

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

使用_.each純粹返回的東西不被建議,這是_.map的用途: '_.map([1,2,3],function(el){ return el; }); ' 用你的代碼表示你的意圖是很好的。 JavaScript的類似於forEach和map的分離效果更好,因爲即使其中存在return語句,每個ea也不會收集函數結果。 –

28

涉及身份的JavaScript代碼模式是基於真實性過濾值,例如,

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

a.filter(_.identity) 

yield [Array [3],Array [2]]。

使用

_.compact(a) 

更加清晰,但一個可能不使用lodash或下劃線在所有,例如

function identity(x) { 
    return x; 
} 

a.filter(identity) 

無論是好的代碼模式有幾個原因值得懷疑,但它在野外使用。

這不是一個空操作的。 NOOP是一個必要的構造,例如彙編,而在函數式編程中,它就像其他函數一樣返回一個值。如果身份是NOOP,那麼所有純粹的功能也可以被認爲是noop,並且這不是一個明智的事情。