lodash 基础篇 slice函数

先看一下基本用法
_.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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容