JavaScript字符串原生支持迭代器,for...of可正确遍历Unicode字符(含emoji、中文等),自动处理代理对;手动调用str[Symbol.iterator]()也可分步获取字符。

JavaScript 中字符串原生支持迭代器,可以直接用 for...of 循环逐个获取字符,包括 Unicode 表情、中文、emoji 等复杂字符(正确处理代理对),无需手动切分或使用 charAt()。
用 for...of 遍历字符串(推荐)
字符串对象的默认迭代器会按 Unicode 字符(而非 UTF-16 代码单元)返回每个“可视字符”,对 emoji、带修饰符的字符(如 ??)、中文、生僻字等都准确:
const str = 'Hello 世界 ?';
for (const char of str) {
console.log(char);
}
// 输出:'H' 'e' 'l' 'l' 'o' ' ' '世' '界' ' ' '?'
这是最简洁、语义清晰且符合现代 JS 规范的方式。
手动调用字符串的迭代器
如果需要更底层控制(比如分步取值),可显式获取迭代器对象:
立即学习“Java免费学习笔记(深入)”;
- 调用
str[Symbol.iterator]()得到迭代器 - 反复调用
.next()获取{ value, done }对象 - 当
done为true时结束
const str = 'a??b';
const iter = str[Symbol.iterator]();
console.log(iter.next()); // { value: 'a', done: false }
console.log(iter.next()); // { value: '??', done: false } —— 正确识别组合 emoji
console.log(iter.next()); // { value: 'b', done: false }
console.log(iter.next()); // { value: undefined, done: true }
注意避开常见陷阱
以下方式**不能可靠逐字符遍历**,尤其对非 BMP 字符(如大多数 emoji):
for (let i = 0; i + <code>str[i]:按 UTF-16 代码单元索引,可能把一个 emoji 拆成两个乱码(如'\uD83D\uDE80'被拆成两个)-
str.split(''):同样基于length,结果数组中代理对被错误分割 -
Array.from(str)是安全的(它内部使用迭代器),但不如for...of直观高效
需要索引时怎么办?
如果既要字符又要位置,可用 for...of 配合 Array.from(str).entries():
for (const [index, char] of Array.from('?abc').entries()) {
console.log(index, char); // 0 '?', 1 'a', 2 'b', 3 'c'
}
或者用扩展运算符转数组再遍历:[...str].forEach((char, i) => {...}),语义清晰且兼容性好。


















