gpt4 book ai didi

javascript - 描述一下这段代码是如何工作的 Symbol.iterator

转载 作者:行者123 更新时间:2023-11-30 14:00:42 25 4
gpt4 key购买 nike

我目前正在阅读 Eloquent Javascript。我无法理解这部分内容。

我不明白 Symbol.iterator 部分。你能解释一下它是如何工作的吗?谢谢

class MatrixIterator {
constructor(matrix) {
this.x = 0;
this.y = 0;
this.matrix = matrix;
}
next() {
if (this.y == this.matrix.height) return {
done: true
};
let value = {
x: this.x,
y: this.y,
value: this.matrix.get(this.x, this.y)
};
this.x++;
if (this.x == this.matrix.width) {
this.x = 0;
this.y++;
}
return {
value,
done: false
};
}
}



Matrix.prototype[Symbol.iterator] = function() {
return new MatrixIterator(this);
};

最佳答案

Symbol.iterator 是一个 well-known symbol (这只是意味着它在规范中定义并可作为 Symbol 的属性使用)这是 JavaScript 在需要从目的。 for-of...(在数组上)等使用迭代器循环遍历对象的内容。

例如,在这段代码中:

const a = [1, 2, 3];
for (const value of a) {
console.log(value);
}

JavaScript 引擎调用a 上的[Symbol.iterator] 方法来获取用于for-of 循环的迭代器。

下面是同样的例子(粗略地)使用迭代器而不是让 for-of 为我们处理它:

const a = [1, 2, 3];
// Get the iterator
const it = a[Symbol.iterator]();
// Get the first result object from it
let result = it.next();
// While the result object doesn't have done = true...
while (!result.done) {
// Get and show this iteration's value
const value = result.value;
console.log(value);

// Get the next result
result = it.next();
}

迭代器的伟大之处在于,它有一个通用的定义方法来获取对象的迭代器,它使 for-of 之类的事情成为可能,而不管被迭代的对象是什么。例如,字符串是可迭代的(一次得到一个字符)。映射是可迭代的(您获得的每个值都是一个 [key, value] 数组)。等等。该对象定义了如何它是如何迭代的,以及它在迭代过程中提供的值。您可以编写一个简单的链表类并使其可迭代,使用它的代码不会关心它是一个链表而不是一个数组或其他什么。

在那个上下文中,这段代码:

Matrix.prototype[Symbol.iterator] = function() {
return new MatrixIterator(this);
};

在原型(prototype)上创建该方法,该方法将分配给通过 new Matrix 创建的对象,以便调用它为调用它的矩阵实例返回一个新的 MatrixIterator

更多on MDN

关于javascript - 描述一下这段代码是如何工作的 Symbol.iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364299/

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