javascript - Javascript 可迭代对象的技术定义是什么?您如何测试它?

标签 javascript iterator ecmascript-6 iterable

我一直在实现 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/

相关文章:

javascript - 我的 ReactJS 代码超出了最大调用堆栈大小

javascript - 未捕获的 DOMException : Failed to execute 'addRule' on 'CSSStyleSheet' : Cannot access StyleSheet to insertRule

Java:如何从字符串中获取 Iterator<Character>

c# - 来自 C# 的 IronPython 生成器的优雅迭代

reference - 如何将具体类型的迭代器特征对象转换为特征对象的迭代器特征对象?

javascript - 如何删除JS中的属性并映射新对象?

javascript - 如何使用 koa2 运行简单的应用程序?

javascript - new URL() - WHATWG URL API

javascript - 异步执行递归数据树构建?

javascript - 使用累加器迭代 jquery 对象?