JavaScript中反转字符串的7种方法全攻略

 更新时间:2026年01月31日 10:29:02   作者:不会敲代码1  
这篇文章主要为大家详细介绍了JavaScript中反转字符串的7种方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下

最近在练习字符串操作时,被一道看似简单的题卡住了: “怎么把 'hello' 变成 'olleh'?”

网上一搜,发现居然有 7 种写法!有的短短一行,有的要写十几行;有的快如闪电,有的可能让浏览器卡住…别慌!今天我就用 最直白的大白话 + 最详细的注释 + 最真实的踩坑记录,带你从零搞懂所有方法——不讲概念,只讲人话;不堆代码,只讲为什么。

一、先搞明白:什么是“反转字符串”

简单说:就是把字符串里的字符顺序完全倒过来

比如:

  • 'abc''cba'
  • 'JavaScript''tpircSavaJ'
  • '12345''54321'

注意:字符串在 JS 中是不可变的(不能直接改),所以每次反转都必须创建一个新字符串

二、7 种方法详解(附完整可运行代码)

每种方法都包含:

  • 一句话原理
  • 带中文注释的代码
  • 小白友好图解
  • 什么时候用 / 什么时候避开

方法1:三步走大法(最常用!推荐新手首选)

split()reverse()join()

function reverseStr(str) {
  // 第一步:把字符串 'abc' 拆成数组 ['a','b','c']
  // split('') 中的 '' 表示“按每个字符拆开”
  const arr = str.split('');

  // 第二步:把数组 ['a','b','c'] 反转成 ['c','b','a']
  // reverse() 是数组的内置方法,会直接修改原数组!
  const reversedArr = arr.reverse();

  // 第三步:把数组 ['c','b','a'] 合并成字符串 'cba'
  // join('') 中的 '' 表示“中间不加任何符号”
  const result = reversedArr.join('');

  return result;
}

console.log(reverseStr('abc')); // 输出:'cba'

小白理解图'abc'→ 拆开:['a', 'b', 'c']→ 翻个身:['c', 'b', 'a']→ 粘起来:'cba'

优点:代码短、好记、适合绝大多数场景

注意:对 emoji(如 '👨‍💻')或带音标的字(如 'café')在老版本浏览器中可能出错(后面会教怎么安全处理)

方法2:传统 for 循环(最稳!兼容性无敌)

function reverseStr(str) {
  let result = ''; // 准备一个空盒子,用来装反转后的字符

  // 从最后一个字符开始,往前数:i = 2 → 1 → 0(因为 'abc' 长度是3,索引是0,1,2)
  for (let i = str.length - 1; i >= 0; i--) {
    result = result + str[i]; // 把当前字符 str[i] 加到 result 后面
  }

  return result;
}

console.log(reverseStr('abc')); // 输出:'cba'

小白理解图(以 'abc' 为例):

循环次数i 的值str[i]result 变化
第1次2'c''' + 'c''c'
第2次1'b''c' + 'b''cb'
第3次0'a''cb' + 'a''cba'

优点:兼容所有浏览器(IE6 都能跑!)、逻辑清晰、性能好

小技巧str.length - 1 是最后一个字符的下标(JS 数组/字符串下标从 0 开始)

方法3:for...of 循环(更现代、更优雅)

function reverseStr(str) {
  let result = ''; // 还是那个空盒子

  // for...of 会自动一个一个拿出字符串里的字符
  for (const char of str) {
    result = char + result; // 关键!不是加在后面,而是加在前面!
  }

  return result;
}

console.log(reverseStr('abc')); // 输出:'cba'

小白理解图(以 'abc' 为例):

循环次数charresult 变化
第1次'a''' + 'a''a'
第2次'b''b' + 'a''ba'
第3次'c''c' + 'ba''cba'

优点:代码更简洁、天然支持 emoji 和中文等复杂字符(Unicode 安全)

记住口诀:“for...of 遍历字符,char + result 就是反转”

方法4:展开运算符法(ES6 新写法,强烈推荐!)

function reverseStr(str) {
  // [...str] 就像魔法:把 'abc' 变成 ['a','b','c']
  // 然后照旧反转 + 合并
  return [...str].reverse().join('');
}

console.log(reverseStr('abc')); // 输出:'cba'

为什么比方法1更好?

  • split('') 在老浏览器中对 '👨‍💻' 可能拆成乱码;
  • [...str] 是 ES6 标准,完美支持所有 emoji、中文、带音标文字
  • 一句话总结:这是方法1的升级版,兼顾简洁 + 安全,现在写代码就用它!

方法5:递归法(理解“自己调自己”,锻炼思维)

function reverseStr(str) {
  // 🚨 退出条件(非常重要!没有它会无限循环直到崩溃)
  if (str === '') {
    return ''; // 空字符串反转还是空字符串
  }

  // 🧩 递归核心:把第一个字符放到“剩下部分的反转结果”后面
  // str.substring(1) → 去掉第一个字符(如 'abc' → 'bc')
  // str.charAt(0) → 拿到第一个字符(如 'abc' → 'a')
  return reverseStr(str.substring(1)) + str.charAt(0);
}

console.log(reverseStr('abc')); // 输出:'cba'

小白理解图(递归调用过程):

reverseStr('abc')
├─ reverseStr('bc') + 'a'
   ├─ reverseStr('c') + 'b'
      └─ reverseStr('') + 'c' → '' + 'c' = 'c'
   → 'c' + 'b' = 'cb'
→ 'cb' + 'a' = 'cba'

重要警告

  • 适合学习算法思想、理解分治(Divide & Conquer)
  • 不要在项目里用! 字符串太长(比如 10000 字符)会爆栈(Stack Overflow),浏览器直接卡死!
  • 类比:就像俄罗斯套娃,一层层打开,最后一层是最小的(空字符串),然后一层层合上。

方法6:reduce 法(函数式编程风,酷炫但需理解)

function reverseStr(str) {
  return [...str].reduce((reversed, char) => {
    // reversed:之前累积的结果(初始为空字符串 '')
    // char:当前正在处理的字符
    return char + reversed; // 把新字符加到前面,实现反转
  }, ''); // '' 是初始值(reversed 的起点)
}

console.log(reverseStr('abc')); // 输出:'cba'

小白理解图(以 'abc' 为例):

步骤reversed(之前结果)char返回值(新 reversed)
初始''
第1次'''a''a' + '''a'
第2次'a''b''b' + 'a''ba'
第3次'ba''c''c' + 'ba''cba'

优点:代码非常“函数式”,没有变量赋值,适合喜欢数学思维的同学

注意reduce 本质也是循环,性能和 for...of 差不多,但初学者可能觉得绕。

方法7:Array.from() 法(方法4的“双胞胎”,同样安全)

function reverseStr(str) {
  // Array.from(str) 和 [...str] 功能完全一样,都是把字符串变成数组
  return Array.from(str).reverse().join('');
}

console.log(reverseStr('abc')); // 输出:'cba'

小知识Array.from(str)[...str] 是等价的,你可以任选其一。

为什么多一种写法?

  • Array.from() 还可以做更多事(比如转换类数组对象),是更通用的 API;
  • [...str] 更简短,是日常开发中的“快捷写法”。

三、新手必看!3 个真实踩坑记录(血泪教训)

坑1:split('')对 emoji 处理错误(老浏览器)

// 在 Chrome 80 以下或某些手机浏览器中:
'👨‍💻'.split(''); // 可能返回 ['', '', '', ''](乱码!)
[...'👨‍💻'];        // 正确返回 ['👨‍💻'](一个完整的 emoji)

解决方案:统一用 [...str]Array.from(str)

坑2:递归调用忘记写“退出条件”

// 错误示范!没有 if 判断,会一直调用自己直到崩溃
function badReverse(str) {
  return badReverse(str.substring(1)) + str.charAt(0);
}
badReverse('abc'); // ❌ 页面卡死!

解决方案:递归函数第一行必须写清楚“什么时候停止”

坑3:reverse()修改了原数组(副作用!)

const arr = ['a', 'b', 'c'];
arr.reverse(); // 直接把 arr 改成了 ['c','b','a']!
console.log(arr); // 输出:['c','b','a'](原数组被改了!)

解决方案:如果不想改原数组,先用 slice() 复制一份:

const newArr = arr.slice().reverse(); // slice() 创建副本

四、终极对比表(选哪个?看这里!)

方法代码长度学习难度运行速度Unicode 安全推荐指数适合谁
split+reverse+join⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐❌(老环境)⭐⭐⭐快速验证想法
传统 for 循环⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐新手入门首选! 兼容性最强
for...of 循环⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐现代项目首选! 简洁安全
展开运算符 [...str]⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐2024 年推荐写法! 简洁+安全
递归⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐学算法/面试准备
reduce⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐喜欢函数式编程者
Array.from⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐作为 [...str] 的替代

给你的明确建议

  • 刚学 JS?方法2(for 循环) 开始,彻底搞懂每一步!
  • 想写现代代码? 主力用 方法4(展开运算符) ,又短又安全!
  • 面试被问“还有别的方法吗?” 把方法1、2、4、5 能说清楚就够了!

五、课后小练习(动手才记得牢!)

请尝试用 至少2种方法 实现以下功能,并在控制台验证:

// 1. 反转一个句子(注意空格位置)
reverseStr('hello world'); // 应该输出 'dlrow olleh'

// 2. 反转带 emoji 的字符串
reverseStr('I ❤️ JS 🌟'); // 应该保持 ❤️ 和 🌟 完整

// 3. 写一个“安全版”函数:对非字符串输入也友好
reverseStr(null);    // 应该输出 ''
reverseStr(123);     // 应该输出 '321'

答案提示:用 String(input) 可以把任意值转成字符串!

六、写在最后:编程不是背代码,而是理解“为什么”

这7种方法,没有绝对的“最好”,只有“最适合当前场景”。

  • 你可能会发现:方法2(for循环)虽然代码长,但每一步都清晰可见;
  • 方法4(展开运算符)虽然只有一行,但背后是整个 ES6 的设计哲学。

附:7种方法完整可运行代码(一键复制)

// 方法1:split+reverse+join(基础版)
function reverse1(str) { return str.split('').reverse().join(''); }

// 方法2:传统for循环(最稳)
function reverse2(str) { let r=''; for(let i=str.length-1;i>=0;i--) r+=str[i]; return r; }

// 方法3:for...of循环(现代简洁)
function reverse3(str) { let r=''; for(const c of str) r=c+r; return r; }

// 方法4:展开运算符(2024推荐!)
function reverse4(str) { return [...str].reverse().join(''); }

// 方法5:递归(理解思想)
function reverse5(str) { return str===''? '': reverse5(str.substring(1)) + str.charAt(0); }

// 方法6:reduce(函数式)
function reverse6(str) { return [...str].reduce((r,c)=>c+r, ''); }

// 方法7:Array.from(方法4的兄弟)
function reverse7(str) { return Array.from(str).reverse().join(''); }

// 测试
console.log('方法1:', reverse1('abc'));
console.log('方法2:', reverse2('abc'));
console.log('方法3:', reverse3('abc'));
console.log('方法4:', reverse4('abc'));
console.log('方法5:', reverse5('abc'));
console.log('方法6:', reverse6('abc'));
console.log('方法7:', reverse7('abc'));

到此这篇关于JavaScript中反转字符串的7种方法全攻略的文章就介绍到这了,更多相关JavaScript反转字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 原生js中ajax访问的实例详解

    原生js中ajax访问的实例详解

    这篇文章主要介绍了原生js中ajax访问的实例详解的相关资料,希望通过本文大家能够掌握理解这部分内容,需要的朋友可以参考下
    2017-09-09
  • JS针对浏览器窗口关闭事件的监听方法集锦

    JS针对浏览器窗口关闭事件的监听方法集锦

    这篇文章主要介绍了JS针对浏览器窗口关闭事件的监听方法,总结整理了几种常用的浏览器关闭事件监听方法,非常简单实用,需要的朋友可以参考下
    2016-06-06
  • 解决layer弹出层msg的文字不显示的问题

    解决layer弹出层msg的文字不显示的问题

    今天小编就为大家分享一篇解决layer弹出层msg的文字不显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • Cpage.js给组件绑定事件的实现代码

    Cpage.js给组件绑定事件的实现代码

    Cpage.js是一款轻量级的Mvvm框架,使用TypeScript(JavaScript的超集)开发。下面通过本文给大家分享Cpage.js给组件绑定事件的实现代码,需要的的朋友参考下吧
    2017-08-08
  • 微信小程序开发之改变data中数组或对象的某一属性值

    微信小程序开发之改变data中数组或对象的某一属性值

    本文通过案例给大家分析了微信小程序开发之改变data中数组或对象的某一属性值,本文通过实例代码相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 原生JS实现pc端轮播图效果

    原生JS实现pc端轮播图效果

    这篇文章主要为大家详细介绍了原生JS实现pc端轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • uniapp的webview实现左滑返回上一个页面操作方法

    uniapp的webview实现左滑返回上一个页面操作方法

    uniapp默认左滑是关闭整个webview,而不是关闭当前页,本文给大家介绍uniapp的webview实现左滑返回上一个页面操作方法,感兴趣的朋友一起看看吧
    2023-12-12
  • js模拟hashtable的简单实例

    js模拟hashtable的简单实例

    本篇文章主要是对js模拟hashtable的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-03-03
  • 表单验证的完整应用案例探讨

    表单验证的完整应用案例探讨

    表单问题,是个纠结的问题,有时候程序又要前端去处理,那要看你的后台搭档怎么样了,接下来一起探讨表单验证吧
    2013-03-03
  • javascript中String类的subString()方法和slice()方法

    javascript中String类的subString()方法和slice()方法

    最近在看《Javascript高级程序设计》一书,在书中发现一些以前没有接触过的且比较实用的技巧和知识点,想通过博客记录一下,以加深记忆。
    2011-05-05

最新评论