function baseSlice(array, start, end)
_.slice
的基本实现,没有迭代调用保护。
@param {Array} array The array to slice.
要切片的数组
@param {number} [start=0] The start position.
开始位置。默认值为 0
@param {number} [end=array.length] The end position.
结束位置。默认值为数组的长度
function baseSlice(array, start, end) {
// 初始化变量
// length 数组的长度
// index
var index = -1,
length = array.length;
if (start < 0) {
// start 除了从 0 开始以外,还可以取复数,这表示从数组的倒数几位取值
// 如果 start 为负数时,它的绝对值超出了数组长度,那么 start 则从 0 开始
start = -start > length ? 0 : (length + start);
}
// end 结束位置不能超出数组长度,如果超出则默认最大值为数组的长度
end = end > length ? length : end;
// 如果 end 结束位置的值为负数,也表示结束到倒数第几位
if (end < 0) {
end += length;
}
// 对长度重新取值
// 起始位置 > 结束位置 ?
// 为 true,长度为 0
// 为 false,长度为 结束位置 减 起始位置 的商
// >>> 是位移运算符,和 >> 不同点在于,如果参考数为负数,>>> 右移时填充数为 0,负数会变得很大
length = start > end ? 0 : ((end - start) >>> 0);
start >>>= 0;
// 这里暂时不清楚 >>>0 有什么意义
// 生成一个 length 长度的数组
var result = Array(length);
// 循环 注意 ++index
while (++index < length) {
// 将 result 的每一项重新赋值,取值的下标为 index + start,循环至新数组长度结束
result[index] = array[index + start];
}
return result;
}
总结:
- 3个参数:baseSlice前,调用它的函数已经判断了数组,所以数组是合法的。
- start参数:如果是负数,判断绝对值是否超过数组长度,如果超出,默认为0;未超出,加上长度,使之成为合规的下标。(负数表明,从数组倒数第几位开始截取)
- end参数:如果超出数组长度,则修改成数组长度
- 起始值和结束值判断:如果起始值超出结束值,则截取条件不成立,数组长度为0,那么后面的循环将不成立
- 循环参数拿取:结束值-起始值得到循环次数,用此次数生成指定长度的新数组,创建一个新的下标,开始循环。新数组的当前下标内容 等于 被截取数组的[新数组当前下标+起始值]的内容(这个新的循环截取思路学习一下!)
网友评论