我一直在实现 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 定义它的任何可迭代对象,所以我对 Javascript 可迭代对象的真正定义是使用 ES6 规范中的术语感兴趣吗?
你如何在 ES6 Javascript 中测试它?
你应该如何迭代一个通用的可迭代对象?
我在 ES6 规范中发现了这样的短语:
If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element array-like object whose first element is a value that will be used as a WeakMap key and whose second element is the value to associate with that key.
但是,它指的是一个@@iterator 方法
,我似乎无法通过该属性名称访问它。
最佳答案
What is the real definition of a Javascript iterable using the term as the ES6 specification does?
§25.1.1.1 定义“Iterable 接口(interface)”。
它们是具有 Symbol.iterator
键控方法的对象,该方法返回一个有效的 Iterator(这反过来又是一个预期行为符合 §25.1.1.2 的对象).
How do you test for it in ES6 Javascript?
我们无法在不调用@@iterator
方法的情况下测试其返回的内容,在不尝试运行它的情况下我们无法测试其结果是否符合Iterator
接口(interface)。最好的选择是做
function looksIterable(o) {
return typeof o[Symbol.iterator] == "function";
}
但是我通常不会对此进行测试,而是在它不可迭代时让它失败并引发异常。
How should you iterate a generic iterable?
不要使用 forEach
。(事实上,永远不要在 ES6 中的任何地方使用 forEach
)。
正确的迭代方式是for (… of …)
循环。它对可迭代性进行所有检查(使用抽象 GetIterator
operation 并运行(甚至关闭)迭代器,并在用于不可迭代值时抛出适当的 TypeError
。
关于javascript - Javascript 可迭代对象的技术定义是什么?您如何测试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559125/