功能

从start开始使用value填充数组到end为止。

 
  _.fill([4, 6, 8, 10], '*', 1, 3);
 // => [4, '*', '*', 10]

fill源码

function fill(array, value, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
    start = 0;
    end = length;
  }
  return baseFill(array, value, start, end);
}
  • array参数如果不存在,就直接返回[]
  • start参数存在,不是number类型的话,(这里还有个isIterateeCall判断,后边再统一分析该方法。)设置start为0,end为数组的长度,就是填充整个数组
  • 经过对参数的处理之后,再去调用baseFill这个核心逻辑

baseFill

function baseFill(array, value, start, end) {
  var length = array.length;

  start = toInteger(start);
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  end = (end === undefined || end > length) ? length : toInteger(end);
  if (end < 0) {
    end += length;
  }
  end = start > end ? 0 : toLength(end);
  while (start < end) {
    array[start++] = value;
  }
  return array;
}
 if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }

对于入参start来讲,如果传的是一个负数,如果是-5,实际上数组长度是4,那么这么start显然是不符合条件的。 所以这里才以-start > end来做判断条件

end = (end === undefined || end > length) ? length : toInteger(end);
if (end < 0) {
end += length;
}
  • end不存在(不传end的时候)或者end大于数组长度,end等于数组长度length,也就是填充到最后
  • 对于负数end,需要追加这个length就是目标的end值。
end = start > end ? 0 : toLength(end);
while (start < end) {
    array[start++] = value;
}
return array;

通过这个遍历赋值完成fill操作。最后返回结果。

总结

_.fill先是对入参进行简单的清洗。再通过baseFill方法处理返回结果。


最普通的一个
301 声望41 粉丝

永远不要做你擅长的事。


引用和评论

0 条评论