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