charAt()可安全遍历BMP字符,兼容旧浏览器;但处理emoji等代理对会出错,推荐for...of实现准确Unicode遍历。

可以用 charAt() 配合循环索引,逐个读取字符串中每个字符,实现简单直接的字符遍历。
用 for 循环配合 charAt 遍历
字符串的 length 属性给出总长度,循环从 0 到 length - 1,每次调用 str.charAt(i) 获取对应位置字符:
- 索引超出范围(如负数或 ≥ length)时,
charAt()返回空字符串'',不会报错 - 与
str[i](方括号访问)不同,charAt()是方法调用,更明确表达“取字符”意图 - 适合需要兼容较老环境(如 IE8)的场景,因为
str[i]在部分旧浏览器中不返回字符而是undefined
处理 Unicode 超出 BMP 的字符需谨慎
charAt() 按 UTF-16 编码单元操作,对 emoji 或某些汉字(如 ?、?)这类由两个代理对(surrogate pair)组成的字符,一次只取一个 16 位单元,可能得到乱码或不完整结果:
- 例如
'??'.charAt(0)返回高位代理符,不是完整人像emoji - 若需正确处理所有 Unicode 字符,建议改用
for...of循环或Array.from(str) - 仅当确定字符串只含 ASCII 或基本多文种平面(BMP)字符时,
charAt()遍历才完全安全
替代写法对比:charAt vs 方括号 vs for...of
三种常见方式适用场景不同:
-
str.charAt(i):语义清晰,兼容性好,适合基础遍历和条件索引访问 -
str[i]:简洁,现代浏览器表现一致,但旧 IE 中行为不统一 -
for (const ch of str):自动按 Unicode 字符(而非编码单元)迭代,最准确,推荐用于新项目
不复杂但容易忽略细节。关键看目标环境和字符串内容是否含扩展 Unicode 字符。

















