Lodash源码阅读-baseTrim

115 阅读2分钟

功能概述

函数的作用很简单 - 就是用来去除字符串两端的空白字符。通过三个步骤(空值判断、尾部空格处理、头部空格处理)来确保在各种场景下都能正确处理字符串。

源码实现

function baseTrim(string) {
  return string
    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "")
    : string;
}

实现原理解析

原理概述

baseTrim 函数的实现原理其实很巧妙,它采用了一种高效的方式来处理字符串两端的空白字符:

  1. 首先通过三元运算符判断字符串是否为空
  2. 然后使用 trimmedEndIndex 函数找到字符串末尾最后一个非空白字符的位置
  3. 最后使用正则表达式去除开头的空白字符

这种实现方式不仅高效,而且能处理各种边界情况。

代码解析

让我们一步步来看这个函数是如何工作的:

1. 空值判断

return string ? ... : string;

这一步是在判断输入是否为空值(null、undefined 或空字符串)。来看几个例子:

baseTrim(null); // null
baseTrim(undefined); // undefined
baseTrim(""); // ''

2. 尾部空格处理

string.slice(0, trimmedEndIndex(string) + 1);

这步使用 trimmedEndIndex 函数找到最后一个非空白字符的位置,然后用 slice 截取到这个位置。看看实际例子:

baseTrim("hello  "); // 'hello'
baseTrim("world\n\t"); // 'world'
baseTrim("  hi  "); // '  hi'

3. 头部空格处理

.replace(reTrimStart, '')

这里的 reTrimStart 正则表达式(/^\s+/)用于匹配字符串开头的空白字符:

  • ^ 表示匹配字符串的开始位置
  • \s 表示匹配任意空白字符(包括空格、制表符、换行符等)
  • + 表示匹配前面的模式一次或多次

所以 reTrimStart 会匹配字符串开头的一个或多个空白字符,然后通过 replace 方法将这些空白字符替换为空字符串,从而实现去除字符串开头的空白字符的功能。例如:

baseTrim("  hello"); // 'hello'
baseTrim("\n\thello"); // 'hello'
baseTrim("  hi  "); // 'hi'

特殊场景处理

这个函数在处理一些特殊情况时也表现得很好:

// 全空白字符串
baseTrim("    "); // ''
baseTrim("\n\t\r"); // ''

// 单个字符
baseTrim(" a "); // 'a'

// 包含多种空白字符
baseTrim("\n hello \t"); // 'hello'

总结

baseTrim 函数通过巧妙的三步走策略(空值判断、尾部空格处理、头部空格处理),高效地实现了字符串两端去空格的功能。