Lodash源码解析一drop

358 阅读1分钟

_.drop

文档解析

image.png

关联函数

image.png

源码解析

// 调用实例
_.drop([1, 2, 3], 2); // => [3]  

// 源码解析 
function drop(array = [1,2,3], n = 2, guard) {
  var length = array == null ? 0 : array.length; // 3
  if (!length) {
    return [];
  }
  n = (guard || n === undefined) ? 1 : toInteger(n); // n不传,默认是1
  // function toInteger(value = 2) {
  //   var result = toFinite(value = 2), ==> 2
  //       remainder = result % 1;  // 0

        /* 
         * 处理传值
        */
        // function toFinite(value = 2) {
        //   if (!value) {
        //     return value === 0 ? value : 0;
        //   }
        //   value = toNumber(value); // 转正数字

              /* 
               *这一步是检测传值是不是无穷大或者无穷小
               */

        //   if (value === INFINITY || value === -INFINITY) {  //  var INFINITY = 1 / 0 ==> 无穷大
        //     var sign = (value < 0 ? -1 : 1);

              /* 
               * MAX_INTEGER = 1.7976931348623157e+308, 
               * 如果vulue是正无穷,就是js的最大值,反之就是最小值
              */
        //     return sign * MAX_INTEGER; 
        //   }
        //   return value === value ? value : 0;  // 2
        // }
       
  //   return result === result ? (remainder ? result - remainder : result) : 0; ===> 2
  // }
  return baseSlice(array =  [1,2,3], n < 0 ? 0 : n, length=3);

  // function baseSlice(array =  [1,2,3], start=2, end=3) {
  //   var index = -1,
  //       length = array.length; // 3

  //   if (start < 0) {
  //     start = -start > length ? 0 : (length + start);
  //   }
  //   end = end > length ? length : end; // 3
  //   if (end < 0) {
  //     end += length;
  //   }
     /* 
      * 核心代码 开始
      */
  //
  //   >>> js的移位符,这里可以理解成取整,保证是整数,计算开始和结束相差几个位置

  //   length = start > end ? 0 : ((end - start) >>> 0);  // ==> 1 
  //   start >>>= 0; // ==> 2 一样的操作保证是正整数

  //   var result = Array(length);  // 创建相同长度数组
   
  //   while (++index < length) {
  //     result[index] = array[index + start]; // 从开始的位置把数据插入,新数组result
  //   }
  //   return result;

      /* 
      * 核心代码 结束
      */
  // }
}

核心代码逻辑:

  • 获取初始值start,end
  • 计算相差的值length
  • 创建目标数组result
  • 循环插入到值之后的数值到新的数组result
  • 抛出result