越看越菜系列

最近在看对角大佬的读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人家重点一个没得学到)

  1. 首先,万幸记得了 lodash里的slice特别就特别在它用的是密集数组,没得用js原生的稀疏数组(具体详细的参见对角大佬的博客)。

  2. 源码里 >>>0 利用无符号右移向下取整的技巧没得记得。

  3. 然后对于 start,end 参数的处理的一些细节也没得注意到。