简介
反转字符串在开发中并不罕见,而且在入门级的面试问题中相当流行。在JavaScript中,我们有很多方法来反转一个字符串。我们可以使用字符串的split() 方法以及数组的reverse() 和join() 方法的组合(因为字符串最终是字符数组)。
我们还可以用我们自己的迭代(循环)或递归函数来反转字符串。
在本指南中,我们将看一下在JavaScript中逆转字符串的几种方法。
使用内置方法来反转字符串 -split()、reverse()和join()。
在JavaScript中反转字符串的最简单的方法是将一个字符串分割成一个数组,reverse() ,然后再join() ,将其还原成一个字符串。使用ES6,这可以缩短和简化为。
let string = "!onaiP"
string = [...string].reverse().join("");
console.log(string); // "Piano!"
在这里,Spread Syntax被用来将字符串分割成一个数组,在功能上等同于split() ,你也可以用这个方法代替。
为了理解为什么它们都能一起工作,让我们概述一下每个函数的作用。
split()
split() 方法在用提供的分隔符分割字符串后返回一个新的字符串数组。
string.split(separator, limit)
separator 定义了字符串在所得数组中分裂成一个元素的位置。我们可以用limit 参数定义数组元素的编号。当我们对一个空字符串使用split() 方法时,'' ,字符串将在每个字符上被分割。当我们将字符串转换为单个字符的数组时,它将派上用场。
同样,你可以使用传播操作符来实现同样的结果。传播操作符是一个JavaScript操作符,可以在数组、字符串和对象等可迭代的对象上工作。我们可以使用传播操作符来复制和连接对象和数组。
[...myVar, 4, 5, 6] // combines myVar array with the given elements
myFunc(...myVar) // Use the myVar's elements as argument to the function
当传播操作符用于字符串时,字符串被转换为一个字符序列。
let str = 'hello';
console.log([...str]); // ["h","e","l","l","o"]
console.log(str.split('')); // ["h","e","l","l","o"]
**注意:**在分割UTF-16字符时,使用传播操作符而不是split() 方法。
reverse()
reverse() ,返回一个反转的数组,在原地。这就是说--原始数组被反转,而不是作为结果返回的副本。
let str = ['a','b','c','d'];
let reversedStr = str.reverse();
console.log(str); // ["d","c","b","a"]
console.log(reversedStr); // ["d","c","b","a"]
你不需要把结果赋给一个新的变量,不过我们通常会这样做,以便把变量的名字改成一个更有指示性的名字。
join()
join() 方法将一个数组的元素连接起来并返回一个字符串。我们还可以指定一个separator ,这是可选的,来连接这些元素。当我们使用默认的分隔符时,元素将在字符串中以逗号分隔。使用一个空的字符串作为分隔符,将连接数组元素并像往常一样返回一个字符串。
let str = ['a','b','c','d'];
console.log(str.join('')); // "abcd"
console.log(str.join()); // "a,b,c,d"
console.log(str.join(' - ')); // "a - b - c - d"
结合内置方法来反转字符串
考虑到所有这些--这些工作方式变得很直观。
let str = 'guitar';
console.log('The original string is: ' + str);
let splitStr = str.split(''); // ["g","u","i","t","a","r"]
let reversedArr = splitStr.reverse();
let reversedStr = reversedArr.join('');
console.log("The reversed string is: " + reversedStr);
或者,你可以把它缩短为
let reversedStr = [...str].reverse().join('');
// Or
let reversedStr = str.split('').reverse().join('');
上述代码的结果是
The original string is: guitar
The reversed string is: ratiug
使用for循环来反转字符串
通过for循环,我们可以遍历字符串中的每个字符。从字符串的末尾开始到字符串的开头--我们可以不断地将这些字符追加到一个新的字符串中,从而形成一个反转的字符串。
const str = 'guitar';
console.log('The original string is: ' + str);
let reversedStr = '';
for (let i = str.length - 1; i >= 0; i--) {
reversedStr += str[i];
}
console.log('The reversed string is: ' + reversedStr);
在这里,我们创建了一个空字符串,reversedStr ,来存放反转的字符串。字符串的索引和数组的索引一样,都是从0开始的。因此,我们从比字符串长度少一个的地方开始循环(拾取字母r ),循环到我们的计数器到0为止(与字母g )。
reversedStr 变量将字符串的元素连接起来。
运行这段代码,我们可以得到这样的输出
The original string is: guitar
The reversed string is: ratiug
使用递归来反转字符串
递归是一个函数自我调用的过程。然而,一个调用自己的函数最终可能会无限地调用自己,如果没有一个退出条件,这个过程就永远不会结束。因此,我们提供一个条件,即 基础条件来结束函数的递归行为。
我们可以使用递归来解决问题,只需写很少的几行代码就可以了,而不需要迭代的麻烦。然而,如果递归深度很高,这个过程会很慢。
一般递归函数的语法是这样的
function recursion(){
.......
base condition
recursion()
.......
}
recursion()
当recursion() 函数被调用时,它首先检查一些条件,如果被评估为true - 该函数调用自己。然后重复这个过程,再重复,再重复。当条件失败时,递归就会停止,而函数则返回一个值。
我们可以在JavaScript中使用递归来反转字符串,使用一些字符串方法,如
substring()和charAt()。
substring() 方法提取了字符串的一部分。我们可以在该方法中传递开始和结束索引作为参数。如果只向方法提供起始索引,它将从该索引提取字符串,直到最后一个索引。
但是,当我们同时提供开始和结束索引时,它将从开始索引提取字符串,但不包括结束索引。
let str = 'hello'
console.log(str.substring(1)) //"ello"
console.log(str.substring(1,3)) //"el"
charAt() 方法从一个字符串中提取索引的字符。它返回一个由该字符组成的新字符串。该方法的一个例子如下所示。
let str = 'hello'
console.log(str.charAt(2)) // "l"
对于我们的递归函数--我们首先检查字符串是否为空,因为 基本条件.经过一系列的递归调用,字符串将变成空的,递归将结束。在reverse() 函数内部,递归函数reverse() 被赋予substring(1) 作为其参数。
charAt() 方法与返回语句中的reverse() 函数相连接。
function reverse(str) {
if (str === '')
return '';
else
return reverse(str.substring(1)) + str.charAt(0);
}
let str = 'guitar'
console.log('The original string is: ' + str);
const output = reverse(str);
console.log('The reversed string is: ' + output);
在第一次递归调用中,reverse("guitar") 将导致reverse("uitar") + "g" 。在第二次调用中,reverse("uitar") ,结果是reverse("itar") + "u" 。同样,最后一次递归调用,reverse("o") ,将返回一个reverse("")+ "r" 。
现在,else 部分的执行被终止,递归将回到其深度。在最后的调用中,字符串r 被添加到reverse('') ,从而得到字符串r 。
接下来,函数调用再往上走一步,字符串a 被添加到reverse("r") 。这就形成了字符串ra 。同样地,t 与ra 相加,就变成了rat 。同样地,递归深度被向上遍历,最后返回字符串ratiug 。
The original string is: guitar
The reversed string is: ratiug
结论
在这篇文章中,我们讨论了如何逆转一个字符串。我们使用了内置的split() ,reverse() 和join() 方法,传播操作符,创建了一个for 循环,创建了一个新的反转字符串,以及使用substring() 和charAt() 的递归函数,都产生了相同的结果。