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

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

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

收到一只叮咚 2019-02-27 13:10:16
_.map = _.collect = function(obj, iteratee, context) {iteratee = cb(iteratee, context);// 这里的keys是希望得到一个数组吧,而实际源码中会得到一个Boolean值// 是否应该换成这种写法?keys = !isArray(obj) ? _.keys(obj) : void 0var 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;};
查看完整描述

1 回答

?
30秒到达战场

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


查看完整回答
反对 回复 2019-03-03
  • 1 回答
  • 0 关注
  • 416 浏览
慕课专栏
更多

添加回答

举报

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