gpt4 book ai didi

javascript - 为什么 for..of 不适用于这个规范函数

转载 作者:行者123 更新时间:2023-11-28 03:13:56 24 4
gpt4 key购买 nike

我很难理解 for..of 循环的概念。我遇到了这个返回对象的规范函数,有下一个函数意味着有迭代器。

function someFunction() {
let n = 0;
return {
next() {
n++;
if (n <= 5) {
return {
value: n * n,
done: false
}
}
return {
value: undefined,
done: true
}
}
};


}
let someStorage = someFunction();
for (let v of someStorage) {
console.log(v);
}

为什么 for..of 循环不能单独工作,为什么我们必须使用 [symbol.iterator]?

最佳答案

简而言之,因为规范是这么说的。请参阅Runtime Semantics: ForIn/OfHeadEvaluation 。当exprValue是被迭代的对象时(例如,for(let v of someStorage)中的someStorage,它运行:

d. Return ? GetIterator(exprValue, iteratorHint).

哪里GetIteratorfor..of 的情况下确实如此:

b. Otherwise, set method to ? GetMethod(obj, @@iterator).

4 Let iterator be ? Call(method, obj).

5 If Type(iterator) is not Object, throw a TypeError exception.

其中 @@iteratorSymbol.iterator(以规范语言表示)。

因此,someStorage 必须有一个 Symbol.iterator 方法,否则使用 for..of 进行迭代> 将不可能。仅仅从函数返回一个对象是不够的。

如果您创建一个具有 Symbol.iterator 属性的对象,它就会起作用:

function someFunction() {
let n = 0;
return {
next() {
n++;
if (n <= 5) {
return {
value: n * n,
done: false
}
}
return {
value: undefined,
done: true
}
}
};
}

const someIterableObject = { [Symbol.iterator]: someFunction };
for (let v of someIterableObject) {
console.log(v);
}

您还可以通过使用生成器来大大简化事情:

function *someFunction() {
let n = 1;
while (n <= 5) {
yield n ** 2;
n++;
}
}

const someIterableObject = { [Symbol.iterator]: someFunction };
for (let v of someIterableObject) {
console.log(v);
}

关于javascript - 为什么 for..of 不适用于这个规范函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59816459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com