素材牛VIP会员
关于underscore源码中map方法的一点疑问?
 10***85  分类:JavaScript  人气:1022  回帖:2  发布于6年前 收藏

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

iteratee = cb(iteratee, context);
// 这里的keys是希望得到一个数组吧,而实际源码中会得到一个Boolean值
// 是否应该换成这种写法?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;

};

 标签:javascript

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv1 新人
10***85 产品经理 6年前#1

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

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

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

Lv5 码农
轻***却 交互设计师 6年前#2

需要注意的是&&||的用法,
当使用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是数组的时候,keysundefined,是一个假值,所以和源码的写法没什么差别。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取