Lodash源码阅读-drop

Lodash 源码阅读-drop

概述

drop 函数是 Lodash 库中的一个数组操作工具,作用是从数组开头删除指定数量的元素并返回剩余部分。简单来说,它就是切掉数组的前几个元素,并返回一个新数组,原数组不会被修改。

前置学习

依赖函数

  • baseSlice :Lodash 内部的数组切片函数,drop 的核心实现依赖于它
  • toInteger :将输入值转换为整数,用来处理参数 n

技术知识

  • 数组切片:从数组中提取部分元素的操作
  • 参数默认值:当参数未提供时使用的值
  • 类型转换:将不同类型的值转换为整数
  • 空值检查 :检查和处理 nullundefined
  • Guard 参数:Lodash 内部用于高阶函数的特殊参数

源码实现

javascript 复制代码
/**
 * Creates a slice of `array` with `n` elements dropped from the beginning.
 *
 * @static
 * @memberOf _
 * @since 0.5.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to drop.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.drop([1, 2, 3]);
 * // => [2, 3]
 *
 * _.drop([1, 2, 3], 2);
 * // => [3]
 *
 * _.drop([1, 2, 3], 5);
 * // => []
 *
 * _.drop([1, 2, 3], 0);
 * // => [1, 2, 3]
 */
function drop(array, n, guard) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  n = guard || n === undefined ? 1 : toInteger(n);
  return baseSlice(array, n < 0 ? 0 : n, length);
}

实现思路

drop 函数的实现非常直接:

  1. 检查输入数组是否为 null/undefined 或空数组,如果是则返回空数组
  2. 处理参数 n(要删除的元素数量):
    • 如果 n 未提供或有 guard 参数,使用默认值 1
    • 否则,将 n 转换为整数
  3. 调用 baseSlice 从索引 n 切割到数组末尾
    • 如果 n 为负数,则从索引 0 开始(相当于不删除任何元素)
  4. 返回切片结果

源码解析

空值和边界检查

javascript 复制代码
var length = array == null ? 0 : array.length;
if (!length) {
  return [];
}

这段代码处理两种情况:

  • arraynullundefined 时,将 length 设为 0
  • 当数组长度为 0 时,直接返回空数组

使用 == 而不是 === 可以同时检查 nullundefined,这是一种常见的简写技巧。

参数处理

javascript 复制代码
n = guard || n === undefined ? 1 : toInteger(n);

这行代码决定删除多少个元素:

  • 如果有 guard 参数(在 _.map 等高阶函数中使用时)或 n 未定义,使用默认值 1
  • 否则,调用 toIntegern 转换为整数

这种处理确保了 n 总是一个合理的整数,无论传入的是什么类型的值。

切片操作

javascript 复制代码
return baseSlice(array, n < 0 ? 0 : n, length);

最后,调用 baseSlice 函数执行实际的切片操作:

  • 从索引 n 开始(如果 n 小于 0,则从 0 开始)
  • 到数组结尾(length
  • 返回这个新的切片数组

baseSlice 函数比原生的 Array.prototype.slice 更高效,尤其是在处理边界情况时。

总结

drop 函数是 Lodash 中一个简单但实用的数组操作工具,它有以下几个特点:

  1. 简单明了:功能单一,易于理解和使用
  2. 不变性:不修改原数组,返回新数组,符合函数式编程原则
  3. 健壮性 :正确处理各种边界情况,如空数组、null 值和负数参数
  4. 灵活性:可以与其他 Lodash 函数组合使用,构建更复杂的数据处理流程

虽然现代 JavaScript 可以通过 Array.prototype.slice(n) 实现类似功能,但 _.drop 提供了更一致的行为和更好的空值处理,特别是在处理可能为 nullundefined 的数组时。

相关推荐
2501_920931702 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得04 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5164 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino4 小时前
图片、文件的预览
前端·javascript
2501_920931706 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05286 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔6 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李6 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN6 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒7 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局