性能

从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办法解决返回后果。