鍍金池/ 問答/HTML/ 關(guān)于underscore源碼中map方法的一點疑問?

關(guān)于underscore源碼中map方法的一點疑問?

_.map = _.collect = function(obj, iteratee, context) {

iteratee = cb(iteratee, context);
// 這里的keys是希望得到一個數(shù)組吧,而實際源碼中會得到一個Boolean值
// 是否應(yīng)該換成這種寫法?keys = !isArray(obj) ? _.keys(obj) : void 0
var keys = !isArrayLike(obj) && _.keys(obj),  
    length = (keys || obj).length,
    results = Array(length);
for (var index = 0; index < length; index++) {
  var currentKey = keys ? keys[index] : index;
  results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;

};

回答
編輯回答
淺時光

你可以去了解一下js的短路運算符。

a&&b意思是a如果是true則返回b,a如果是false則返回a

a||b意思是a如果是false則返回b,a如果是true則返回a

2017年6月10日 06:42
編輯回答
脾氣硬

需要注意的是&&||的用法,
當(dāng)使用a && b的時候,如果a是假值,則不會對b求值;
當(dāng)使用a || b的時候,如果a是真值,則不會對b求值;

// 當(dāng)obj是數(shù)組的時候,keys是false,當(dāng)obj不是數(shù)組的時候,返回鍵值組成的數(shù)組
var keys = !isArrayLike(obj) && _.keys(obj),
    // 當(dāng)obj是數(shù)組的時候,keys是false,所以(keys || obj)的結(jié)果是obj,所以length=obj.length,注意因為obj是數(shù)組,所以obj.length正好是數(shù)組的長度;
    // 當(dāng)obj不是數(shù)組的時候,keys是obj的鍵值組成的數(shù)組;
    length = (keys || obj).length,
    results = Array(length);
for (var index = 0; index < length; index++) {
    // 當(dāng)obj是數(shù)組的時候,keys是false,所以currentKey就是index;
    // 當(dāng)obj不是數(shù)組的時候,keys是鍵值組成的數(shù)組,currentKey是keys[index];
    var currentKey = keys ? keys[index] : index;
    results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;

所以當(dāng)obj是數(shù)組的時候,keys只要是一個假值,這段代碼就能正確執(zhí)行,

keys = !isArray(obj) ? _.keys(obj) : void 0

這種寫法,在obj是數(shù)組的時候,keysundefined,是一個假值,所以和源碼的寫法沒什么差別。

2018年4月29日 13:48