我一直在实现ES6 Set
对象的有用子类.对于我的许多新方法,我想接受一个可以是另一个Set或一个数组的参数,或者我可以迭代的任何东西.我一直在调用我的界面中的"可迭代"并只使用.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定义的那样支持任何迭代,所以我对Javascript可迭代的真正定义是什么感兴趣,因为ES6规范使用了这个术语?
你如何在ES6 Javascript中测试它?
你应该如何迭代一般的迭代?
我在ES6规范中找到了这样的短语:
如果存在参数iterable,则期望它是一个实现@@ iterator方法的对象,该方法返回一个迭代器对象,该对象生成一个类似于二元素的对象,其第一个元素是一个将用作WeakMap键的值,其第二个元素是与该键关联的值.
但是,这指的@@iterator method
是我似乎无法通过该属性名称访问的内容.
使用ES6规范的术语,Javascript可迭代的真正定义是什么?
§25.1.1.1定义"的可迭代接口".
它们是一个Symbol.iterator
带有-keyed方法的对象,它返回一个有效的迭代器(它反过来是一个预期按照§25.1.1.2行事的对象).
你如何在ES6 Javascript中测试它?
我们无法在@@iterator
不调用它的情况下测试该方法返回的内容,并且我们无法测试结果是否符合Iterator
接口而不尝试运行它.最好的选择是做
function looksIterable(o) { return typeof o[Symbol.iterator] == "function"; }
但是我通常不会对此进行测试,只是让它失败,但是当它不可迭代时会出现异常.
你应该如何迭代一般的迭代?
不要用forEach
.(事实上,永远不要forEach
在ES6的任何地方使用).
迭代的正确方法是for (… of …)
循环.它执行所有迭代检查(使用抽象GetIterator
操作并运行(甚至关闭)迭代器,并TypeError
在非可迭代值上使用时抛出适当的s).