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,是一个假值,所以和源码的写法没什么差别。
添加回答
举报