为了账号安全,请及时绑定邮箱和手机立即绑定

关于underscore源码中map方法的一点疑问?

关于underscore源码中map方法的一点疑问?

米琪卡哇伊 2019-05-24 10:08:09
_.map=_.collect=function(obj,iteratee,context){iteratee=cb(iteratee,context);//这里的keys是希望得到一个数组吧,而实际源码中会得到一个Boolean值//是否应该换成这种写法?keys=!isArray(obj)?_.keys(obj):void0varkeys=!isArrayLike(obj)&&_.keys(obj),length=(keys||obj).length,results=Array(length);for(varindex=0;index
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

需要注意的是&&和||的用法,当使用a&&b的时候,如果a是假值,则不会对b求值;当使用a||b的时候,如果a是真值,则不会对b求值;
//当obj是数组的时候,keys是false,当obj不是数组的时候,返回键值组成的数组
varkeys=!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(varindex=0;index//当obj是数组的时候,keys是false,所以currentKey就是index;
//当obj不是数组的时候,keys是键值组成的数组,currentKey是keys[index];
varcurrentKey=keys?keys[index]:index;
results[index]=iteratee(obj[currentKey],currentKey,obj);
}
returnresults;
所以当obj是数组的时候,keys只要是一个假值,这段代码就能正确执行,
keys=!isArray(obj)?_.keys(obj):void0
这种写法,在obj是数组的时候,keys是undefined,是一个假值,所以和源码的写法没什么差别。
                            
查看完整回答
反对 回复 2019-05-24
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

你可以去了解一下js的短路运算符。
a&&b意思是a如果是true则返回b,a如果是false则返回a
a||b意思是a如果是false则返回b,a如果是true则返回a
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信