JavaScript字符串处理应优先使用slice()截取、includes()判断包含、toLocaleLowerCase()处理大小写,并注意Unicode字符和正则全局标志g;避免substr()废弃方法及indexOf()误判。

JavaScript 字符串处理不需要引入任何库,所有操作都基于原生 String 类型的方法和 RegExp 对象,但很多开发者会误用或忽略边界情况,导致替换失败、大小写异常、Unicode 截断等问题。
字符串截取用 slice() 而不是 substring() 或 substr()
slice() 支持负数索引(从末尾开始计),语义清晰,且不会自动交换参数顺序;substring() 会把小数放前面、大数放后面,substr() 已被废弃(MDN 标记为 deprecated)。
- 要取后 3 个字符:用
'hello'.slice(-3)→'llo' - 要截掉前两个字符:用
str.slice(2),别用str.substring(2)(虽然结果一样,但逻辑不一致) - 负数起始 + 正数结束:如
'abcde'.slice(-4, -1)→'bcd',而substring()不支持负数
大小写转换注意 locale 和非 ASCII 字符
toLowerCase() 和 toUpperCase() 默认按 Unicode Basic Latin 处理,在土耳其语、希腊语等 locale 下可能出错(比如土耳其的 'I'.toLowerCase() 应该是 'ı',不是 'i')。
- 普通英文场景:直接用
str.toLowerCase() - 国际化应用:显式指定 locale,如
str.toLocaleLowerCase('tr-TR') - 避免对含 emoji 或组合字符的字符串调用
toUpperCase()后再比较——某些符号(如 ß)转大写会变成两个字符('ß'.toUpperCase()→'SS'),破坏长度预期
正则替换必须加 g 标志才能全局替换
str.replace(/a/, 'b') 只换第一个 'a';漏掉 g 是最常见错误之一。另外,若替换内容含变量,必须用 RegExp 构造函数,不能直接拼接字符串字面量。
立即学习“Java免费学习笔记(深入)”;
- 全局替换空格:
str.replace(/\s/g, '_') - 动态替换关键词:
const keyword = 'foo'; str.replace(new RegExp(keyword, 'g'), 'bar') - 想保留原始大小写做替换?用函数作为第二个参数:
str.replace(/([a-z])/g, (m, p1) => p1.toUpperCase())
判断是否包含子串优先用 includes(),不用 indexOf() !== -1
includes() 语义明确、可读性强,且支持第二个参数(起始位置);indexOf() 返回数字,容易和 falsy 值混淆(比如 str.indexOf('a') === 0 是合法开头,但 !str.indexOf('a') 会误判)。
- 检查是否存在:
str.includes('http') - 从第 10 个字符后检查:
str.includes('test', 10) - 注意:IE 不支持
includes(),如需兼容,可用str.indexOf('x') >= 0替代,但别用!= -1—— 容易和==混淆
真正麻烦的是 Unicode 字符串操作,比如 emoji('??')、带重音符号的字母('café'),它们在 .length 和 .split('') 中表现异常;处理这类字符串时,应优先考虑 Array.from(str) 或使用 Intl.Segmenter(较新 API),而不是默认的字符索引方式。











