17370845950

javascript怎样进行字符串处理【教程】
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 构造函数,不能直接拼接字符串字面量。

  • 全局替换空格: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),而不是默认的字符索引方式。