如何在JavaScript中反转一个字符串

599 阅读6分钟

简介

反转字符串在开发中并不罕见,而且在入门级的面试问题中相当流行。在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 。同样地,tra 相加,就变成了rat 。同样地,递归深度被向上遍历,最后返回字符串ratiug

The original string is: guitar
The reversed string is: ratiug

结论

在这篇文章中,我们讨论了如何逆转一个字符串。我们使用了内置的split()reverse()join() 方法,传播操作符,创建了一个for 循环,创建了一个新的反转字符串,以及使用substring()charAt() 的递归函数,都产生了相同的结果。