在用户定义的[Symbol.iterator]迭代中,[Symbol.iterator]叫什么?

时间:2018-07-07 18:40:58

标签: javascript

tutorial中,它解释了如何使用户定义的迭代成为可能,

  

那么我们如何在我们自己的对象上实现可迭代协议?我们的确是   通过使用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 };
      }
    };
  }
}

2 个答案:

答案 0 :(得分:4)

在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符号,并将该符号分配为方法名称。

答案 1 :(得分:2)

我认为您对密钥属性方法这两个术语感到困惑。在javascript中,方法只是分配给属性的函数。例如:

obj = {
   method() {}
}

类似于

obj = {
  method: function() {

  }
}

这种混淆来自于以下事实:上面的语法是简写形式,实际上只是ES6中引入的语法糖。直到那时,将匿名方法分配给属性是定义对象方法的唯一方法。因此,是的[Symbol.iterator]是关键。因为

obj = {
  [Symbol.iterator]() {}
}

几乎*与

相同
obj = {
  [Symbol.iterator]: function() {}
}

*几乎相同,因为速记还为该函数提供了与默认方法不同的toString()方法。如果在两种情况下都执行console.log(obj [Symbol.iterator]),则将得到[Symbol.iterator]() {}function() {}