字符串 · 7/8

字符串反转

实现字符串反转的多种方法

问题

实现一个函数,将输入的字符串反转后返回。

reverse('hello') // 'olleh'
reverse('abc123') // '321cba'

解答

方法一:数组方法

function reverse(str) {
  // 字符串转数组 -> 反转 -> 数组转字符串
  return str.split('').reverse().join('');
}

console.log(reverse('hello')); // 'olleh'

方法二:for 循环

function reverse(str) {
  let result = '';
  // 从后往前遍历,依次拼接字符
  for (let i = str.length - 1; i >= 0; i--) {
    result += str[i];
  }
  return result;
}

console.log(reverse('hello')); // 'olleh'

方法三:递归

function reverse(str) {
  // 递归终止条件
  if (str.length <= 1) return str;
  // 取最后一个字符 + 剩余部分的反转
  return str[str.length - 1] + reverse(str.slice(0, -1));
}

console.log(reverse('hello')); // 'olleh'

方法四:扩展运算符

function reverse(str) {
  // 扩展运算符将字符串展开为数组
  return [...str].reverse().join('');
}

console.log(reverse('hello')); // 'olleh'

处理 Unicode 字符

split('') 无法正确处理 emoji 等 Unicode 字符:

// 错误示例
'😀abc'.split('').reverse().join(''); // 乱码

// 正确处理
function reverseUnicode(str) {
  // 扩展运算符能正确识别 Unicode 字符
  return [...str].reverse().join('');
}

console.log(reverseUnicode('😀abc')); // 'cba😀'

关键点

  • split('').reverse().join('') 是最简洁的写法
  • split('') 无法正确处理 emoji,用扩展运算符 [...str] 代替
  • 递归方式注意终止条件,避免栈溢出
  • 循环方式性能最好,适合处理长字符串