JavaScript 中 for...of 可直接遍历字符串,按 Unicode 码点返回每个字符,正确处理 emoji、中文及组合字符,无需转数组;注意其遍历的是码点而非字节或 UTF-16 单元,对增补字符(如??)按实际码点序列迭代。

JavaScript 中可以用 for...of 循环直接遍历字符串的每个字符,因为字符串是可迭代对象(实现了 Symbol.iterator),无需转成数组就能逐个访问。
直接用 for...of 遍历字符串
字符串在 ES6+ 中默认可迭代,for...of 会按 Unicode 码点顺序返回每个字符(正确处理大多数常见字符,包括大部分 emoji 和带组合符的字符):
const str = "Hello ?";
for (const char of str) {
console.log(char);
}
// 输出:H、e、l、l、o、 、?(共 7 次循环)
注意:for...of 遍历的是“Unicode 码点”,不是字节或 UTF-16 单元
这意味着它能较合理地处理多数双字节字符(如 emoji、中文、带重音符号的字母等),但对极少数需要四个 UTF-16 单元表示的字符(即 Unicode 码点 > 0x10000 的增补字符),for...of 仍能正确拆分为单个逻辑字符(因为底层使用的是字符串的迭代器,已按码点切分):
- ✅ 正确处理:"??"(程序员 emoji,由多个码点组成,但作为单个用户感知字符)→
for...of将其视为一个迭代项(需注意:实际行为取决于字符串构造方式和 Unicode 标准化;严格来说,它按码点序列迭代,而复杂 emoji 常由多个码点 + 连接符组成,for...of不自动合并) - ⚠️ 注意边界:若字符串含未配对的代理对(如截断的 UTF-16),可能产生
替换字符,但这属于数据损坏,非语法问题
对比其他方法(避免常见误区)
-
不要用
for...in:它遍历字符串的索引(字符串索引是字符串形式的数字),且可能受原型链影响,不适用于取字符 -
避免
for (let i = 0; i:虽然可用,但对含代理对的字符(如 ?)可能把一个字符误判为两个,导致取到无效的str[i] -
不用
Array.from(str)再遍历:多余转换,for...of已足够简洁高效
如果需要索引,搭配 Array.entries() 或手动计数
原生 for...of 不提供索引,如需下标,推荐:
立即学习“Java免费学习笔记(深入)”;
const str = "abc";
let i = 0;
for (const char of str) {
console.log(i++, char); // 0 a, 1 b, 2 c
}
// 或更函数式写法:
for (const [index, char] of Array.from(str).entries()) {
console.log(index, char);
}


















