String.prototype[Symbol.iterator]()
String 对象的 [Symbol.iterator]() 方法实现了 iterable protocol,它允许字符串被大多数期望 iterable 的语法所使用,例如 spread 语法 和 for...of 循环。它返回一个 string iterator object,该对象会逐个产生字符串中的 Unicode code point。
试一试
const str = "The quick red fox jumped over the lazy dog's back.";
const iterator = str[Symbol.iterator]();
let theChar = iterator.next();
while (!theChar.done && theChar.value !== " ") {
console.log(theChar.value);
theChar = iterator.next();
// Expected output: "T"
// "h"
// "e"
}
语法
js
string[Symbol.iterator]()
参数
无。
返回值
一个实现 iterable iterator object 的新对象,它会逐个产生字符串中的 Unicode code point。
描述
字符串是按 Unicode code point 进行迭代的。这意味着字形簇(grapheme clusters)会被拆分,但代理对(surrogate pairs)会被保留。
js
// "Backhand Index Pointing Right: Dark Skin Tone"
[..."👉🏿"]; // ['👉', '🏿']
// splits into the basic "Backhand Index Pointing Right" emoji and
// the "Dark skin tone" emoji
// "Family: Man, Boy"
[..."👨👦"]; // [ '👨', '', '👦' ]
// splits into the "Man" and "Boy" emoji, joined by a ZWJ
示例
使用 for...of 循环进行迭代
请注意,您很少需要直接调用此方法。[Symbol.iterator]() 方法的存在使得字符串成为 iterable,像 for...of 循环这样的迭代语法会自动调用此方法来获取迭代器以进行循环。
js
const str = "A\uD835\uDC68B\uD835\uDC69C\uD835\uDC6A";
for (const v of str) {
console.log(v);
}
// "A"
// "\uD835\uDC68"
// "B"
// "\uD835\uDC69"
// "C"
// "\uD835\uDC6A"
手动创建迭代器
你仍然可以手动调用返回的迭代器对象的 next() 方法,以实现对迭代过程的最大控制。
js
const str = "A\uD835\uDC68";
const strIter = str[Symbol.iterator]();
console.log(strIter.next().value); // "A"
console.log(strIter.next().value); // "\uD835\uDC68"
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-string.prototype-%symbol.iterator% |
浏览器兼容性
加载中…