乐趣区

关于lodash:lodash源码之fill方法

性能

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

退出移动版