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