JavaScript字符串处理应优先使用slice()截取、includes()判断包含、toLocaleLowerCase()处理大小写,并注意Unicode字符和正则全局标志g;避免substr()废弃方法及indexOf()误判。
JavaScript 字符串处理不需要引入任何库,所有操作都基于原生 String 类型的方法和 RegExp 对象,但很多开发者会误用或忽略边界情况,导致替换失败、大小写异常、Unicode 截断等问题。
slice() 而不是 substring() 或 substr()
slice() 支持负数索引(从末尾开始计),语义清晰,且不会自动交换参数顺序;substring() 会把小数放前面、大数放后面,substr() 已被废弃(MDN 标记为 deprecated)。
'hello'.slice(-3) → 'llo'
str.slice(2),别用 str.substring(2)(虽然结果一样,但逻辑不一致)'abcde'.slice(-4, -1) → 'bcd',而 substring() 不支持负数toLowerCase() 和 toUpperCase() 默认按 Unicode Basic Latin 处理,在土耳其语、希腊语等 locale 下可能出错(比如土耳其的 'I'. 应该是 
'ı',不是 'i')。
str.toLowerCase()
str.toLocaleLowerCase('tr-TR')
toUpperCase() 后再比较——某些符号(如 ß)转大写会变成两个字符('ß'.toUpperCase() → 'SS'),破坏长度预期g 标志才能全局替换str.replace(/a/, 'b') 只换第一个 'a';漏掉 g 是最常见错误之一。另外,若替换内容含变量,必须用 RegExp 构造函数,不能直接拼接字符串字面量。
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')
str.includes('test', 10)
includes(),如需兼容,可用 str.indexOf('x') >= 0 替代,但别用 != -1 —— 容易和 == 混淆真正麻烦的是 Unicode 字符串操作,比如 emoji('??')、带重音符号的字母('café'),它们在 .length 和 .split('') 中表现异常;处理这类字符串时,应优先考虑 Array.from(str) 或使用 Intl.Segmenter(较新 API),而不是默认的字符索引方式。