在 JavaScript 中反转字符串
反转字符串确实是 JavaScript 中最常见且最需要的操作之一。在任何软件开发人员的职业生涯中,面试中一个非常重要且基本的问题是“如何在 JavaScript 中反转字符串”。
在 JavaScript 中,有几种方法可以反转字符串。我们可以使用循环、内置函数、递归,甚至正则表达式来解决这个问题。在本文中,我将通过示例展示这些方法。那么,让我们开始吧!
🔶内置方法:split()、reverse()、join()
我想要讨论的第一个方法可能是最常用的方法,即使用内置方法。首先,我们需要将字符串拆分为单个字符数组,即(“s”,“t”,“r”,“i”,“n”,“g”),然后反转字符,最后将它们重新连接起来以创建反转字符串。
让我们先看一个例子:
在这个例子中,基本上使用了三种内置方法String.prototype.split()
。它们是 : 、Array.prototype.reverse()
& Array.prototype.join()
。为了便于理解,我将进行详细的解释。
🔸String.prototype.split()
方法将 String 对象拆分为多个子字符串,从而将其转换为一个字符串数组。在本例中,stringToReverse.split("")返回如下结果:
['S', 'o', 'f', 't', 'w','a', 'r', 'e', ' ', 'D', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r']
🔸 将字符串拆分为字符串数组后,Array.prototype.reverse()
主要工作就是将单个数组元素反转。第一个数组元素现在是最后一个数组元素,反之亦然。
在我们的例子中,splitString.reverse()返回的输出如下:
['r', 'e', 'p', 'o', 'l', 'e', 'v', 'e', 'D', ' ', 'e', 'r', 'a', 'w', 't', 'f', 'o', 'S']
🔸 该方法最终将先前由split()Array.prototype.join()
方法分隔的所有单个字符重新连接起来,以重新组成反转的字符串。在我们的示例中,最终输出为:
repoleveD erawtfoS
链接这些方法
好吧,这三种方法可以链接起来,以下面的方式使我们的代码紧凑和干净,并且输出将是相同的。
但是,除了使用,我们还可以使用ES6 语法String.prototype.split()
来完成这项工作。它的工作方式与以前相同。Spread Operator [...]
因此,扩展运算符所做的工作与split()完全相同,它将字符串对象拆分为单个字符。
🔶使用递减 For 循环
这是在 JavaScript 中反转字符串的一种简单且最古老的方法,但在任何地方都很有效。
🔸 首先,newString创建了一个空字符串来存放新创建的字符串。🔸
循环的起点是(str.length - 1),它对应于字符串的最后一个字符“r”。只要i大于或等于零,循环就会继续。我们在每次迭代后将i递减。🔸
然后,该函数返回反转后的字符串。
我们还可以使用JavaScript ES6for loop
引入的语法,它也非常易于使用,并且减少了编写循环条件时出错的机会。
比之前的for 循环简洁多了,不是吗?而且效果确实不错!
🔸 for 循环条件中的 "c" 表示将字符串中的每个字母都视为一个字符。为了便于理解,我在下图中添加了两个 console.log() 语句,您也可以在终端中查看输出。
🔶递归方法:递归方法
使用递归方法是 JavaScript 中另一种非常著名的反转字符串的方法。我们需要两种方法来执行这种递归方法。一种是String.prototype.substr()
方法,另一种是String.prototype.charAt()
方法。
让我们看一个例子:
🔸 String.prototype.substr()方法返回字符串的一部分,从指定的索引开始,延伸给定数量的字符。
在我们的示例中,该部分str.substr(1)
返回"ecursion"。
🔸String.prototype.charAt()
方法从字符串中返回指定字符
。 在我们的示例中,部分str.charAt(0)
返回"R"。
🔸reverseString(str.substr(1)) + str.charAt(0)
首先返回字符串的一部分,从返回子字符串中第一个字符的索引处开始。该方法的第二部分满足if 条件,并且嵌套层数最高的调用立即返回。
需要记住的是,此方法不会只有一次调用,而是会有多次嵌套调用。
然而,这种方法并不是反转字符串的最佳方法,因为递归的深度等于字符串的长度,并且对于非常长的字符串,它比任何其他方法花费更多的时间,并且堆栈的大小是这里的主要关注点。
🔶 使用 Array.prototype.reduce() 方法
该Array.prototype.reduce()
方法对数组的每个元素执行Reducer回调函数,传入前一个元素计算的返回值,并返回单个值作为最终结果。语法可以写成:reduce((previousValue, currentValue) => { ... } )
让我们看一个例子。
function reverseString(str) {
const arr = str.split("");
const stringReversed = arr.reduce((reversed, character) => {
return character + reversed;
}, "");
return stringReversed;
}
console.log(reverseString("Swarnali")); //ilanrawS
🔸 reverseString函数以字符串str作为参数。🔸
我们需要做的第一件事是将字符串拆分成单个字符。我们采用数组arr来保存这些值。🔸
reduce() 函数接受两个参数,即reversed和character。如果我们将其与 reduce() 的基本语法进行比较,则 reversed是前一个值/累加器,而character是当前值。函数 stringReversed 返回当前值加上前一个值,这实际上是反转整个数组字符并以相反的方式将它们连接在一起。
如果我们使用 JavaScript ES6 语法,这个代码块可以更紧凑。👇
const reverseString = (str) => {
return str.split("").reduce((reversed, character) => character + reversed, "");
};
console.log(reverseString("Roy is a Developer"));
//repoleveD a si yoR
使其成为一行代码:
const reverseString = (str) => str.split("").reduce((reversed, character) => character + reversed, "");
console.log(reverseString("Roy is a developer"));
//repoleveD a si yoR
🔶使用正则表达式(RegEx)
这是反转字符串最罕见、最棘手的方法之一,但热爱JavaScript 正则表达式的开发者绝对可以尝试一下。而且,在任何面试中,如果你能展示这一点,那可能是一个加分点,因为这种方法通常不会被人使用,而且他们会知道你掌握了另一项技能——正则表达式!
以下是此方法的一个示例:
let str = "My name is Swarnali Roy";
let regex = /.{1,1}/ig
let result = str.match(regex);
let reveresed = result.reverse().join("");
console.log(reveresed); //yoR ilanrawS si eman yM
🔸正则表达式中最简单的量词是花括号中的数字: {n}。量词附加到字符(或字符类,或 [...] 集合等)后,指定我们需要的字符数量。
在我们的示例中, {1,1} 表示我们恰好需要匹配 1 个字符。如果我们编写 console.log(result),则会得到如下结果:['M', 'y', ' ', 'n', 'a','m', 'e', ' ', 'i', 's', ' ', 'S', 'w', 'a', 'r', 'n', 'a', 'l', 'i', ' ','R', 'o', 'y']
🔸这里的正则表达式主要将字符串对象拆分成数组中的单个字符。拆分后,reverse() 和 join() 方法的工作方式与split()
我spread operator
上面在内置方法中演示的完全相同。