越看越菜系列
最近在看对角大佬的读lodash源码,第一篇本来看过去了的读lodash源码之从slice看稀疏数组与密集数组,后面需要用到slice,就想着自己按照思想写一个
function slice(array,start,end){
let length = array == null ? 0 : array.length;
if(!length)
{
return [];
}
if(start<0)
{
start+=length;
}
if(end < 0){
end+=length;
}
length = start > end ? 0 : (end - start)
let res = [];
for(let i = 0 ;i < length;i++){
res.push(array[i+start]);
}
return res;
}
let array = new Array(10);
console.log(slice(array,1,7));
跑倒是能跑,但是 emmm跟源码一比,惨不忍睹丫,真的菜的肉眼可见,这还是好好看了大佬讲代码之后的,照着源码改了一下:
function slice(array,start,end){
let length = array == null ? 0 : array.length;
if(!length)
{
return [];
}
//start 默认为0
start = start == null? 0 : start;
end = end == null ? length : end;
if(start<0)
{
// start+=length;
start = -start > length ? 0 : (length + start);
}
end = end > length ? length : end;
if(end < 0){//end的值<0不会出现bug
end+=length;
}
length = start > end ? 0 : ((end - start) >>> 0);
start >>>= 0; // 效果相对于向下取整
let index = -1;
const res = new Array(length);
while(++index < length)
{
res[index] = array[index + start];
}
return res;
}
let array = new Array(10);
console.log(slice(array,1,7));
//输出均为:
[ undefined, undefined, undefined, undefined, undefined, undefined ]
总结一下 自己的问题(emmm人家重点一个没得学到)
-
首先,万幸记得了 lodash里的slice特别就特别在它用的是密集数组,没得用js原生的稀疏数组(具体详细的参见对角大佬的博客)。
-
源码里 >>>0 利用无符号右移向下取整的技巧没得记得。
-
然后对于 start,end 参数的处理的一些细节也没得注意到。