javascript - 在使用 [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 };
}
};
}
}
解决方案
在 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
符号,并将该符号指定为方法名称。
推荐阅读
- firebase - iOS 上的 Firebase 邀请 - 如何从通用链接获得邀请?
- html - 如何从文本文件中读取数据并将其附加到选择标签的选项中
- excel - 为什么excel在这里崩溃?
- git - 如何使用 github 集成撤消 atom 上的“放弃所有更改”(Windows)
- php - 如何在数组中显示数组
- javascript - 使用 componentDidUpdate 反应无限循环
- angular - Rxjs 异步拦截器 - 不断收到错误
- html - 如何在标题和内容部分的中间浮动图像?
- erlang - 在 Erlang VM 和 NIF 之间传递 BIGINT
- r - 如何创建一个新的数据框来比较值并仅获取 R 中的最新数据?