字符串的 Iterator 接口

字符串是一个类似数组的对象,也原生具有 Iterator 接口。

  1. var someString = "hi";
  2. typeof someString[Symbol.iterator]
  3. // "function"
  4. var iterator = someString[Symbol.iterator]();
  5. iterator.next() // { value: "h", done: false }
  6. iterator.next() // { value: "i", done: false }
  7. iterator.next() // { value: undefined, done: true }

上面代码中,调用Symbol.iterator方法返回一个遍历器对象,在这个遍历器上可以调用 next 方法,实现对于字符串的遍历。

可以覆盖原生的Symbol.iterator方法,达到修改遍历器行为的目的。

  1. var str = new String("hi");
  2. [...str] // ["h", "i"]
  3. str[Symbol.iterator] = function() {
  4. return {
  5. next: function() {
  6. if (this._first) {
  7. this._first = false;
  8. return { value: "bye", done: false };
  9. } else {
  10. return { done: true };
  11. }
  12. },
  13. _first: true
  14. };
  15. };
  16. [...str] // ["bye"]
  17. str // "hi"

上面代码中,字符串 str 的Symbol.iterator方法被修改了,所以扩展运算符(...)返回的值变成了bye,而字符串本身还是hi