美文网首页
2022-04-06 lodash源码学习 - baseSlic

2022-04-06 lodash源码学习 - baseSlic

作者: 网恋被骗二块二 | 来源:发表于2022-04-06 21:51 被阅读0次

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;
      }

总结

  1. 3个参数:baseSlice前,调用它的函数已经判断了数组,所以数组是合法的。
  2. start参数:如果是负数,判断绝对值是否超过数组长度,如果超出,默认为0;未超出,加上长度,使之成为合规的下标。(负数表明,从数组倒数第几位开始截取)
  3. end参数:如果超出数组长度,则修改成数组长度
  4. 起始值和结束值判断:如果起始值超出结束值,则截取条件不成立,数组长度为0,那么后面的循环将不成立
  5. 循环参数拿取:结束值-起始值得到循环次数,用此次数生成指定长度的新数组,创建一个新的下标,开始循环。新数组的当前下标内容 等于 被截取数组的[新数组当前下标+起始值]的内容(这个新的循环截取思路学习一下!)

相关文章

网友评论

      本文标题:2022-04-06 lodash源码学习 - baseSlic

      本文链接:https://www.haomeiwen.com/subject/peddsrtx.html