The base implementation of ‘_.fill’ without an iteratee call guard.
_.fill
的基本实现,没有迭代调用保护。
参数同 fill 的差不多:数组、填充值、起始位置、结束为止
function baseFill(array, value, start, end) {
// 前情提要,该 baseFill 的调用是由 fill 满足条件之后的调用,所以 array 是满足条件的一个数组
// 取出长度
var length = array.length;
// start 再转化一次整数
start = toInteger(start);
// 如果 start 转化后小于 0
if (start < 0) {
// 说明起始位置是倒数第几位
// 当然,如果正数 start 超过了长度,那就从第0位开始,否则就通过计算,求出start的起始位置
start = -start > length ? 0 : (length + start);
}
// 判断end参数存在吗?
// 如果end参数没有传递,则为undefined,判断条件为 true,end取数组的长度
// 如果end参数有传递,则判断end是否超过了数组长度?
// 如果end参数超出了数组长度,则end取数组的长度,否则,将end转化为整数
end = (end === undefined || end > length) ? length : toInteger(end);
// 如果end小于0
if (end < 0) {
// 则表示是填充到从数组的倒数第几位,通过计算,得出正确的下标
end += length;
}
// 最后判断起始位置和结束位置的下标,若起始位置超出了结束位置
// end 取 0,
// 否则toLength 将 `value` 转换为适合用作类数组对象长度的整数。如 3.2 => 3,infinity => 4294967295
end = start > end ? 0 : toLength(end);
// 根据起始位置和结算位置开始循环
while (start < end) {
// 若起始位置超出结束位置,那么循环一开始就不成立,最后只会返回原数组
// 若起始位置和结束位置的参数合理,那么每次循环,将会改变数组中对应索引的值,最后返回修改后的数组
array[start++] = value;
}
return array;
}
网友评论