Lodash 源码阅读-trimmedEndIndex

93 阅读2分钟

功能概述

trimmedEndIndex 函数的主要作用是查找字符串中最后一个非空白字符的位置索引。这个函数通常作为字符串去除尾部空白字符的辅助函数,它能帮助我们精确定位到需要保留的字符串的结束位置。

源码实现

function trimmedEndIndex(string) {
  var index = string.length;

  while (index-- && reWhitespace.test(string.charAt(index))) {}
  return index;
}

var reWhitespace = /\s/;

实现原理解析

原理概述

这个函数的实现原理其实很简单,就像是从后往前检查字符串的每一个字符,直到找到第一个不是空白的字符为止。

代码分析

  1. 变量初始化
var index = string.length;

这行代码将 index 初始化为字符串的长度。为什么要从最后开始呢?因为我们要找的是最后一个非空白字符的位置。

示例:

const str = "Hello World   ";
// 初始时 index = 13
  1. 循环检查条件
while (index-- && reWhitespace.test(string.charAt(index))) {}

这行代码是整个函数的核心,它做了两件事:

  • index--:每次循环都将索引向前移动一位
  • reWhitespace.test(string.charAt(index)):检查当前位置的字符是否为空白字符

让我们通过几个例子来看看这个循环是如何工作的:

示例 1:普通字符串

const str = "Hello World   ";
// 第一次循环:index = 12,检查空格,继续
// 第二次循环:index = 11,检查空格,继续
// 第三次循环:index = 10,检查空格,继续
// 第四次循环:index = 9,检查'd',停止
// 最终返回 9

示例 2:全是空白字符的字符串

const str = "     ";
// 循环会一直执行到index变为-1
// 最终返回 -1

示例 3:没有尾部空白的字符串

const str = "Hello";
// 第一次循环:index = 4,检查'o',立即停止
// 最终返回 4
  1. 返回结果
return index;

函数返回找到的最后一个非空白字符的位置索引。这个返回值有几种情况:

  • 如果字符串末尾有空白字符,返回最后一个非空白字符的索引
  • 如果字符串没有尾部空白字符,返回最后一个字符的索引(即 string.length - 1)
  • 如果字符串全是空白字符,返回-1

总结

trimmedEndIndex 通过从后向前遍历的方式,配合正则表达式判断空白字符,高效地找出了字符串中最后一个非空白字符的位置。这个函数在字符串处理中经常被用作辅助函数,特别是在需要去除字符串尾部空白字符的场景中。