🎭 玩转JavaScript字符串:从“反转乾坤”到“回文侦探”的趣味指南

8 阅读6分钟

前言

字符串堪称JS界的“百搭选手”;——不管是做表单验证、处理用户昵称,还是玩回文小游戏,都绕不开它!今天咱不聊枯燥的概念,用一堆有趣的例子,把字符串的核心玩法扒得明明白白~

一、🔄 字符串反转:给文字来个“后空翻”;

想把“干饭人”变成“人饭干”字符串反转这招必须拿捏!

基础玩法:三步搞定反转

// 目标:把"干饭人"翻成"人饭干"
const str = '干饭人';
// 1. 拆成单个字符的数组(字符串太"倔",数组才好掰扯)
const arr = str.split('');
// 2. 给数组来个乾坤大挪移
arr.reverse();
// 3. 重新拼回字符串
const reversedStr = arr.join('');
console.log(reversedStr); // 输出:人饭干 🥣

懒人版:一行装到底

不想写三步?安排!直接链式调用,主打一个简洁:

const str = '奶茶续命';
const reversedStr = str.split('').reverse().join('');
console.log(reversedStr); // 输出:命续茶奶 🧋

小知识点💡

方法名参数含义效果说明
split(separator, limit)

1. separator(必填):分隔符,决定按什么拆分;
2. limit(可选):限制拆分后数组的长度,可省略。

返回一个新数组,原字符串不变;
示例:'干饭人'→split('')→['干','饭','人'];
示例:'奶茶,咖啡,可乐'→split(',', 2)→['奶茶','咖啡']。
reverse()无参数
直接修改原数组,不返回新数组;
效果是将数组元素顺序彻底反转;
示例:['干','饭','人']→reverse()→['人','饭','干'](⚠️ 原数组被修改)。
join(separator)separator(可选):拼接符,决定数组元素之间用什么连接,可省略(默认用逗号连接)。
返回一个拼接好的新字符串,原数组不变;
示例:['人','饭','干']→join('')→'人饭干';
示例:['炸鸡','薯条']→join('+')→'炸鸡+薯条'。

二、🕵️ 回文侦探:判断字符串是不是正反都一样

回文字符串就是"正看反看都顺眼"的狠角色——比如'上海自来水来自海上'、'abba',教你两种方法揪出它们!

方法1:懒人对比法(躺平式判断)

核心思路:把字符串反转后和原串比一比,长得一样就是回文~

function isPalindrome(s) {
    // 先统一小写(避免"AbBa"这种调皮鬼捣乱)
    const lowerStr = s.toLowerCase();
    // 反转字符串(老熟人组合拳)
    const reversedStr = lowerStr.split('').reverse().join('');
    // 是不是双胞胎?返回结果!
    return lowerStr === reversedStr;
}

console.log(isPalindrome('上海自来水来自海上')); // true 🌊
console.log(isPalindrome('abba')); // true

方法2:双指针法(高效小能手)

不想反转整个字符串?用两个"指针小弟"从两头往中间凑,逐一核对字符,效率更高~

function isPalindrome(s) {
    const lowerStr = s.toLowerCase();
    let left = 0; // 左指针:从开头出发 🚶
    let right = lowerStr.length - 1; // 右指针:从结尾出发 🚶‍♂️

    while (left < right) {
        // 字符不一样?直接出局!
        if (lowerStr[left] !== lowerStr[right]) {
            return false;
        }
        // 指针向中间贴贴
        left++;
        right--;
    }
    // 全员匹配!是回文~
    return true;
}

// 测试一下
console.log(isPalindrome('noon')); // true ⏰
console.log(isPalindrome('螺蛳粉粉蛳螺')); // true 🥘

两种方法大比拼🥊

方法优点缺点适用场景
懒人对比法代码短、一看就会要多占点内存日常小场景、短字符串
双指针法省内存、速度快代码稍多一丢丢长字符串、追求性能

三、✨ 字符串超实用招式大全(高频款)

除了反转和判回文,这些招式日常开发天天用,记牢少踩坑!

1. “字符串”↔“数组”互转(必备基本功)

  • split(分隔符, 限制长度):把字符串拆成数组
const str = '奶茶,咖啡,可乐';
console.log(str.split(',')); // ['奶茶','咖啡','可乐'] ☕️
console.log(str.split(',', 2)); // 只拆前2个 → ['奶茶','咖啡']
  • join(分隔符):数组粘回字符串
const arr = ['炸鸡', '薯条', '汉堡'];
console.log(arr.join('+')); // 炸鸡+薯条+汉堡 🍔

2. 揪出指定位置的字符(精准定位)

  • charAt(下标):按位置找字符,越界返回空串

  • str[下标]:ES6懒人写法,越界返回undefined

const str = '小龙虾';
console.log(str.charAt(1)); // 龙 🦞
console.log(str[2]); // 虾
console.log(str.charAt(10)); // ''(找不到就装哑巴)
console.log(str[10]); // undefined(找不到就摊牌)

3. 字符串拼接(花式组CP)

  • `+` 运算符:最直白的拼法

  • 模板字符串:ES6yyds,支持换行+变量,颜值拉满

const userName = '小明';
const food = '烤串';
// 老式拼法
console.log(userName + '爱吃' + food); // 小明爱吃烤串 🍢
// 新潮拼法(推荐!)
console.log(`${userName}
超爱吃${food}`); // 支持换行,输出更灵活

image.png

4. 字符串截取(精准切分)

  • slice(起始, 结束):灵活截取,支持负数(从末尾数)
const str = '草莓蛋糕好好吃';
console.log(str.slice(0, 4)); // 草莓蛋糕 🍰
console.log(str.slice(-3)); // 好好吃(取最后3个字符)

5. 查找&amp;替换(找bug/改内容)

  • includes():判断是否包含某段字符,返回布尔值

  • replace():替换内容,加`/内容/g`全局换

const str = '今天吃火锅,明天吃火锅,天天吃火锅';
console.log(str.includes('火锅')); // true 🍲
console.log(str.replace('火锅', '烤肉')); // 今天吃烤肉,明天吃火锅,天天吃火锅
console.log(str.replace(/火锅/g, '烤肉')); // 全局替换:今天吃烤肉,明天吃烤肉,天天吃烤肉 🥩

6. 去空格+大小写(细节控必备)

  • trim():去掉首尾多余空格(填表单超常用)

  • toLowerCase()/toUpperCase():大小写切换

const str = '  我爱吃榴莲  ';
console.log(str.trim()); // 我爱吃榴莲 🥭
console.log('AbCdEf'.toLowerCase()); // abcdef
console.log('abc'.toUpperCase()); // ABC

四、🎨 实战小案例:给字符串"插个队"

想给'炸鸡配啤酒'中间加个'快乐',变成'炸鸡快乐配啤酒'

let str = '炸鸡配啤酒';
// 1. 拆成数组:['炸鸡','配啤酒']
let arr = str.split('配');
// 2. 在下标1的位置插入"快乐配"(splice:删n个+插内容)
arr.splice(1, 0, '快乐配');
// 3. 粘回字符串
str = arr.join('');
console.log(str); // 输出:炸鸡快乐配啤酒 🥳

上面案例中用到了slice的“亲戚”splice,两者经常被混淆,这里用表格彻底分清,参数、效果一次性讲透👇

方法名参数含义效果说明核心区别
splice(start, deleteCount, item1, ...)1. start(必填):起始下标,决定从哪个位置开始操作;
2. deleteCount(必填):要删除的元素个数,填0表示不删除;
3. item1, ...(可选):要插入的元素,可插入多个,省略则只删除不插入。
直接修改原数组,返回被删除的元素组成的数组;
修改原数组,可删可插,“全能选手”
slice(start, end)1. start(必填):起始下标,从该位置开始截取;支持负数(从末尾数,-1表示最后一个元素);
2. end(可选):结束下标,截取到该位置(不包含end本身);省略则截取到数组/字符串末尾。
不修改原数组/字符串,返回截取到的新内容(数组/字符串);
不修改原内容,只截取,“只读选手”
const arr = [1, 2, 3, 4, 5];
// 删除 2 个元素,从索引 1 开始
const removed = arr.splice(1, 2); // removed = [2, 3]
console.log(arr); // [1, 4, 5](原数组被修改)

// 在索引 1 处插入元素,不删除
arr.splice(1, 0, 'a', 'b'); // 返回 []
console.log(arr); // [1, 'a', 'b', 4, 5]

// 替换元素:删除 1 个,并插入新元素
arr.splice(2, 1, 'x'); // 返回 ['b']
console.log(arr); // [1, 'a', 'x', 4, 5] 
const arr = [1, 2, 3, 4, 5];
const newArr = arr.slice(1, 4); // [2, 3, 4](索引 1 到 3 的元素)
console.log(arr); // [1, 2, 3, 4, 5](原数组不变)
const str = "Hello World";
const newStr = str.slice(0, 5); // "Hello"
console.log(str); // "Hello World"(原字符串不变)

💡 小提醒:案例中用的是split拆分字符串,splice操作数组,而slice既能操作字符串,也能操作数组,用法完全一致哦!

五、⚠️ 避坑小提醒

  1. 字符串是"铁憨憨":所有修改操作都会返回新字符串,原串纹丝不动!
const str = '雪糕';
str.toUpperCase(); // 返回'雪糕',但原串还是'雪糕'
console.log(str); // 雪糕 🍦
  1. 下标别越界:charAt()越界返回空串,str[]越界返回undefined,记得判断~

总结

  1. 🌀 字符串反转靠split('') + reverse() + join('')组合拳,简单又好用;

  2. 🕵️ 回文判断有两种玩法:懒人对比法(易上手)、双指针法(更高效);

  3. ✨ 日常高频招式:拆分/拼接、截取、查找替换、去空格,记牢能省超多事~