功能
从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方法处理返回结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。