我一直在实现一个有用的ES6 Set
子类。对于我的许多新方法,我想接受一个参数,该参数可以是另一个Set或Array,或者任何我可以迭代的东西。在接口中,我一直称之为“可迭代对象”,并仅使用.forEach()
对其进行操作(这对于Set或Array都有效)。示例代码:
// remove items in this set that are in the otherIterable
// returns a count of number of items removed
remove(otherIterable) {
let cnt = 0;
otherIterable.forEach(item => {
if (this.delete(item)) {
++cnt;
}
});
return cnt;
}
或者
// add all items from some other iterable to this set
addTo(iterable) {
iterable.forEach(item => {
this.add(item);
});
}
然而,我怀疑我的代码并未按照ES6定义的 iterable 的方式来支持任何可迭代对象,所以我很想了解JavaScript iterable 的真正定义,就像ES6规范中使用这个术语的方式是什么?
在ES6 JavaScript中如何测试它?
如何迭代一个通用的可迭代对象?
我在ES6规范中发现了这样的短语:
如果参数iterable存在,则应该是一个实现@@iterator方法的对象, 该方法返回一个迭代器对象,该迭代器对象生成一个类似于数组的两个元素组成的对象, 其中第一个元素是将用作WeakMap键的值,第二个元素是与该键关联的值。
但那是指 @@iterator 方法,我似乎无法通过该属性名称访问它。
Symbol.iterator
。 - Pointyfoo[Symbol.iterator] = function() ...
(或者将其放在原型上)。 - PointySymbol.iterator
的问题。 - jfriend00@@iterator
的含义,可以留给他们自己讨论 - 或者不讨论它,但是提供一个链接。 - Bergi