相关疑难解决方法(0)

Javascript可迭代的技术定义是什么?如何测试它?

我一直在实现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;
}
Run Code Online (Sandbox Code Playgroud)

要么

// add all items from some other iterable to this set
addTo(iterable) {
    iterable.forEach(item => {
        this.add(item);
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑我可能并没有像ES6定义的那样支持任何迭代,所以我对Javascript可迭代的真正定义是什么感兴趣,因为ES6规范使用了这个术语?

你如何在ES6 Javascript中测试它?

你应该如何迭代一般的迭代?

我在ES6规范中找到了这样的短语:

如果存在参数iterable,则期望它是一个实现@@ iterator方法的对象,该方法返回一个迭代器对象,该对象生成一个类似于二元素的对象,其第一个元素是一个将用作WeakMap键的值,其第二个元素是与该键关联的值.

但是,这指的@@iterator method是我似乎无法通过该属性名称访问的内容.

javascript iterator iterable ecmascript-6

4
推荐指数
1
解决办法
282
查看次数

JavaScript中的生成器和闭包有什么区别?

对同一问题使用这两种解决方案有什么区别?

封闭方式

const numberIncrementer = startValue => () => startValue++
const getNextNumber = numberIncrementer(0)

console.log(getNextNumber())
// 0

console.log(getNextNumber())
// 1

console.log(getNextNumber())
// 2
Run Code Online (Sandbox Code Playgroud)

生成器方法

const numberIncrementer = function*(startValue) {
    while(true) {
        yield startValue++
    }
}

const numberFactory = numberIncrementer(0)
const getNextNumber = () => numberFactory.next().value

console.log(getNextNumber())
// 0

console.log(getNextNumber())
// 1

console.log(getNextNumber())
// 2
Run Code Online (Sandbox Code Playgroud)

查看这两种方法,我为什么要选择一种方法呢?

javascript closures generator ecmascript-6

3
推荐指数
1
解决办法
635
查看次数

创建异步迭代器的最佳实践是什么?我应该使用异步生成器函数还是使用 Symbol.asyncIterator?

此代码按预期工作:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getAsyncData() {
    await sleep(1000);  // simulate database/network delay...
    return [1, 2, 3, 4, 5];  // ...then return some data
}

const asyncIterable = (async function* filterAsyncData() {
    const items = await getAsyncData();

    for (const item of items) {
        yield item;
    }
})();

const asyncIterable2 = {
    [Symbol.asyncIterator]() {
        return {
            values: null,
            idx: 0,
            async next() {
                if (this.values === null) {
                    this.values = await getAsyncData();
                } …
Run Code Online (Sandbox Code Playgroud)

javascript iterator generator node.js async-await

2
推荐指数
1
解决办法
2359
查看次数