for...of 可直接遍历字符串并按 unicode 码点正确分割字符,适用于英文、数字、汉字及基础 emoji;但对复杂组合 emoji(如 ??)可能拆分为单个码点,需 intl.segmenter 或第三方库处理语义字符。

JavaScript 中 for...of 循环可以直接遍历字符串中的每个字符,因为字符串在 ES6+ 中是可迭代对象(实现了 Symbol.iterator 方法)。
直接用 for...of 遍历字符串
字符串会被自动按 Unicode 码点(而非 UTF-16 编码单元)拆分为字符,对大多数常见字符(包括英文、数字、汉字、基础 emoji)都能正确处理:
const str = "Hello 世界 ?";
for (const char of str) {
console.log(char);
}
// 输出:H e l l o (空格)世 界 (空格)?
注意:正确处理扩展 Unicode 字符(如某些 emoji 或组合字符)
像 ?、??、?❤️? 这类由多个 Unicode 码点组成的“合成字符”,for...of 默认仍按单个码点遍历,但部分复杂 emoji 可能被拆开。若需完整语义字符(grapheme clusters),需借助 Intl.Segmenter(较新 API)或第三方库(如 grapheme-splitter)。
简单场景下,for...of 已比 for(let i=0; i<str.length i> 更可靠,因为它不依赖 <code>.length(该值按 UTF-16 编码单元计数,可能把一个 emoji 算作 2 个)。
对比其他遍历方式
-
不要用
for...in:它遍历字符串的索引(字符串转为类数组对象),返回的是数字字符串如"0"、"1",不是字符。 -
避免传统
for循环 +str[i]:对代理对(surrogate pairs)如 ?,str[0]和str[1]可能各返回半个码元,导致乱码。 -
Array.from(str)或[...str]:也能得到字符数组,适合需要先收集再操作的场景,但不如for...of节省内存。
小技巧:带索引遍历
如果既要字符又要位置,可以配合 Array.from() 或使用 entries():
const str = "abc";
for (const [index, char] of Array.from(str).entries()) {
console.log(index, char); // 0 'a', 1 'b', 2 'c'
}
// 或
for (const [index, char] of [...str].entries()) {
console.log(index, char);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











