lodash判断数组_lodash源码解析:chunk、slice、toInteger、toFinite、toNumber

本文深入解析lodash库中chunk、slice、toInteger、toFinite和toNumber等核心方法的源码,结合官方文档详细解读其功能和实现,并探讨纯JS实现的可能性。同时,提到了辅助方法isObject、isSymbol和getTag,以及参考的You-Dont-Need-Lodash-Underscore仓库。
摘要由CSDN通过智能技术生成

31898087594a55daa93fcdaa6bdcd72b.png

上一阵子一直在忙着对前端界做出一点微小的贡献,再过两个多月就能揭晓。现在打算开一个天坑,把 lodash 的源码挨个解析一遍,学习下 npm 下载量最大、依赖最多的库的源码逻辑。

解析的代码为 2020 年 7 月 18 日的lodash 源码,版本是4.17.15,fork 到了自己的仓库中,顺序按照官网文档的顺序,在解析时会将该方法依赖的子方法也会全部分析下。有很多自己难理解或理解错的地方,抛砖引玉。

chunk

文档地址:https://lodash.com/docs/4.17.15#chunk

import slice from './slice.js';
import toInteger from './toInteger.js';

/**
 * 将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。
 * 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。
 *
 * @since 3.0.0
 * @category Array
 * @param {Array} array 需要处理的数组
 * @param {number} [size=1] 每个数组区块的长度
 * @returns {Array} 返回一个包含拆分区块的新数组(注:相当于一个二维数组)。
 * @example
 *
 * chunk(['a', 'b', 'c', 'd'], 2)
 * // => [['a', 'b'], ['c', 'd']]
 *
 * chunk(['a', 'b', 'c', 'd'], 3)
 * // => [['a', 'b', 'c'], ['d']]
 */
function chunk(array, size = 1) {
    
  // size必须大于等于0
  size = Math.max(toInteger(size), 0);
  // array为假时,length设为0;为真时设为数组长度
  const length = array == null ? 0 : array.length;
  // length为假或size为0时,返回空数组
  if (!length || size < 1) {
    
    return [];
  }
  // 初始化一个长度为(length / size并向上取整)的数组
  let index = 0;
  let resIndex = 0;
  const result = new Array(Math.ceil(length / size));

  // 循环取区块并赋值给result数组的对应位置
  while (index < length) {
    
    result[resIndex++] = slice(array, index, (index += size));
  }
  // 返回result
  return result;
}

export default chunk;

slice

文档地址:https://lodash.com/docs/4.17.15#slice

/**
 * 创建一个数组,来源是裁剪数组array,从 start 位置开始到 end 位置结束,但不包括 end 本身的位置。
 *
 * **注意:** 这个方法被用来代替
 * [`Array#slice`](https://mdn.io/Array/slice)确保返回的是个稠密数组。
 *
 * @since 3.0.0
 * @category Array
 * @param {Array} array 要裁剪的数组
 * @param {number} [start=0] 开始位置。负数索引将会被看作从数组结束位置的向前偏移。
 * @param {number} [end=array.length] 结束位置。负数索引将会被看作从数组结束位置的向前偏移。
 * @r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值