先看一下基本用法
_.slice(array, [start=0], [end=array.length])
裁剪数组array,从 start 位置开始到end结束,但不包括 end 本身的位置。
var arrayList=[1,2,3,4,5,6,7];
console.log(arrayList);
console.log(_.slice(arrayList,null,3)); //[1,2,3]
console.log(_.slice(arrayList,-3,-2)); //[5]
console.log(_.slice(arrayList,-2));//[6,7]
我们先看一下lodash的代码然后一行一行解读
function slice(array, start, end) {
let length = array == null ? 0 : array.length
if (!length) {
return []
}
start = start == null ? 0 : start
end = end === undefined ? length : end
if (start < 0) {
start = -start > length ? 0 : (length + start)
}
end = end > length ? length : end
if (end < 0) {
end += length
}
length = start > end ? 0 : ((end - start) >>> 0)
start >>>= 0
let index = -1
const result = new Array(length)
while (++index < length) {
result[index] = array[index + start]
}
return result
}
首先是数组array是否合法的判断:先判断数组是否是null,是null返回0,否则是数组的长度,js中0是false,!0是true,数组不存在直接返回。
let length = array == null ? 0 : array.length
if (!length) {
return []
}
开始位置start和结束位置end默认值:start 不寻在的话取0,end不存在取数组的长度。
start = start == null ? 0 : start
end = end === undefined ? length : end
start和end支持负数,如果start是负数,假如是数组是[1,2,3,4,5],start是-2,当-start就是2,2不大于5,start就等于3,end若大于数组长度,取数组的长度,若果end小于0,end就等于length+(end)。
if (start < 0) {
start = -start > length ? 0 : (length + start)
}
end = end > length ? length : end
if (end < 0) {
end += length
}
在MDN中:>>>是无符号右移,>>是有符号移位
1 如果不能转换为Number,那就为0
2 如果为非整数,先转换为整数
3 如果是正数,返回正数,如果是负数,返回负数 + 2的32次方
length = start > end ? 0 : ((end - start) >>> 0)
start >>>= 0
接下来就是循环判断最后把result返回
let index = -1
const result = new Array(length)
while (++index < length) {
result[index] = array[index + start]
}
return result