首页 > 解决方案 > 在使用 [Symbol.iterator] 的用户定义迭代中,[Symbol.iterator] 叫什么?

问题描述

在解释如何使用户定义的可迭代的教程中,它说

那么我们如何在自己的对象上实现可迭代协议呢?我们通过定义一个键为 Symbol.iterator 的方法来做到这一点。

[Symbol.iterator]考虑到它是方法的一部分,将其称为键是否正确?我的理解是键只能是属性的一部分(属性由键和值组成),方法是对象内部使用的函数。

作为参考,这是教程中的示例:

class UserCollection {
  constructor(users) {
    this.users = [].concat(users);
  }

  [Symbol.iterator]() {
    let i = 0;
    let users = this.users;

    return {
      next() {
        if (i < users.length) {
          return { done: false, value: users[i++] };
        }

        return { done: true };
      }
    };
  }
}

标签: javascript

解决方案


在 ES6 中,您可以通过表达式定义方法名称,使用[]. 这允许您创建计算的方法名称(计算键)。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions

例如,以下都是等价的:

class Foo {
    myMethod() {}
}

class Foo {
    ['my'+'Method']() {}
}

const m = 'myMethod';
class Foo {
    [m]() {}
}

所有 3 个创建Foo.myMethod().

在您的情况下,[Symbol.iterator]允许您获取iterator符号,并将该符号指定为方法名称。


推荐阅读