1 回答

TA貢獻1828條經驗 獲得超6個贊
需要注意的是&&和||的用法,
當使用a && b的時候,如果a是假值,則不會對b求值;
當使用a || b的時候,如果a是真值,則不會對b求值;
// 當obj是數組的時候,keys是false,當obj不是數組的時候,返回鍵值組成的數組
var keys = !isArrayLike(obj) && _.keys(obj),
// 當obj是數組的時候,keys是false,所以(keys || obj)的結果是obj,所以length=obj.length,注意因為obj是數組,所以obj.length正好是數組的長度;
// 當obj不是數組的時候,keys是obj的鍵值組成的數組;
length = (keys || obj).length,
results = Array(length);
for (var index = 0; index < length; index++) {
// 當obj是數組的時候,keys是false,所以currentKey就是index;
// 當obj不是數組的時候,keys是鍵值組成的數組,currentKey是keys[index];
var currentKey = keys ? keys[index] : index;
results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
所以當obj是數組的時候,keys只要是一個假值,這段代碼就能正確執行,
keys = !isArray(obj) ? _.keys(obj) : void 0
這種寫法,在obj是數組的時候,keys是undefined,是一個假值,所以和源碼的寫法沒什么差別。
添加回答
舉報