JavaScript字符串不可变,所有方法均返回新字符串;需注意slice/substring/substr参数差异、replace默认不全局、substr已废弃、全角空格trim无效等高频坑点。

JavaScript 字符串是不可变的原始类型,所有“修改”操作实际都返回新字符串——这是理解所有方法行为的前提。
获取字符和子串:charAt()、charCodeAt()、slice()、substring()、substr()
这些方法用于提取内容,但参数逻辑差异大,容易混用:
-
slice(start, end)支持负数索引(从末尾计),end不包含;超出范围不报错,返回空字符串或截断结果 -
substring(start, end)会自动交换大小顺序(substring(3,1) === substring(1,3)),且不支持负数 -
substr(start, length)已被废弃,length是要取的字符数,不是结束位置;现代代码应避免使用 -
charAt(index)返回单字符字符串,越界时返回空字符串;charCodeAt(index)返回 Unicode 编码值,越界返回NaN
const str = "hello"; str.slice(1, 3); // "el" str.substring(3, 1); // "el"(自动调换) str.charAt(-1); // ""(不支持负索引) str.at(-1); // "o"(ES2022 新增,推荐替代 charAt)
查找与判断:includes()、indexOf()、startsWith()、endsWith()
这些方法返回布尔值或索引,注意它们对大小写敏感,且不支持正则(除 search() 外):
-
includes(searchStr, fromIndex)最直观,返回true/false -
indexOf(searchStr, fromIndex)返回首次匹配索引,未找到返回-1;适合需要定位场景 -
startsWith(searchStr, position)和endsWith(searchStr, length)的第二个参数含义不同:前者是检查起始位置,后者是检查前多少个字符 - 如需忽略大小写,先转成统一大小写再查,不要依赖正则(除非真需要模式匹配)
const str = "Hello World";
str.includes("world"); // false
str.toLowerCase().includes("world"); // true
str.startsWith("He"); // true
str.endsWith("ld", 8); // true(只检查前 8 个字符:"Hello Wo")
替换与分割:replace()、replaceAll()、split()
字符串替换默认只换第一个匹配项,这点常被忽略:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
replace(searchValue, replaceValue)中searchValue可以是字符串或正则;若为字符串,仅替换首处 -
replaceAll(searchValue, replaceValue)要求searchValue不能是普通字符串(除非启用了global标志的正则),否则抛出TypeError -
split(separator, limit)的separator为空字符串时,会把每个字符拆成数组;limit控制最多拆出几项
const str = "a-b-c-d";
str.replace("-", "+"); // "a+b-c-d"(只换第一个)
str.replaceAll("-", "+"); // "a+b+c+d"(ES2021+)
str.replaceAll(/-/g, "+"); // 等效写法(兼容旧环境)
str.split("", 3); // ["a", "-", "b"]
大小写与空白处理:toLowerCase()、trim() 及其变体
看似简单,但涉及国际化和 Unicode 边界问题:
-
toLowerCase()和toUpperCase()在土耳其语等语言中可能出错;如需准确本地化转换,用toLocaleLowerCase(locale) -
trim()只去除首尾空白(U+0020、\t、\n、\r 等);trimStart()和trimEnd()更精准控制 -
trim()对全角空格(如中文空格 U+3000)无效,需手动处理或用正则
const str = " \t\n hello world \u3000 "; str.trim(); // "hello world "(全角空格还在) str.replace(/^[\s\u3000]+|[\s\u3000]+$/g, ""); // 手动清除含全角空格
字符串方法大多返回新值而非修改原串,链式调用安全;但要注意 replace() 默认不全局、substr() 已废弃、全角空白需额外处理——这些是线上 bug 的高频来源。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










