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