Javascript 为什么我们使用[Symbol.iterator]而不是'for'循环?

Javascript 为什么我们使用[Symbol.iterator]而不是'for'循环?,javascript,iterator,symbols,Javascript,Iterator,Symbols,我正在阅读,我很难理解为什么我们需要定义MatrixIterator函数来迭代矩阵的内容。我通常在另一个for的内部使用for来迭代二维矩阵的内容,类似于。是因为JS中每个对象的[Symbol.iterator]在调用for循环的缩写时都会被使用,这是for的 此外,我是否正确地假设标准的[Symbol.iterator]无法自动迭代二维对象,因此需要创建矩阵迭代器并将其指定为: Matrix.prototype[Symbol.iterator] = function() { return

我正在阅读,我很难理解为什么我们需要定义
MatrixIterator
函数来迭代
矩阵的内容。我通常在另一个
for
的内部使用
for
来迭代二维矩阵的内容,类似于。是因为JS中每个对象的
[Symbol.iterator]
在调用
for
循环的缩写时都会被使用,这是
for

此外,我是否正确地假设标准的
[Symbol.iterator]
无法自动迭代二维对象,因此需要创建
矩阵迭代器并将其指定为:

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

我们是否可以这样做:
Matrix.prototype[Symbol.iterator]=MatrixIterator

离题:我觉得我应该更深入地了解其他一些事情,因为我对这些概念感到相当困惑。有人能详细说明接口的含义吗?书中确实提到了:

这样一个程序的不同部分通过接口、有限的函数集或绑定相互交互,这些函数或绑定在更抽象的级别上提供有用的功能,隐藏了它们的精确实现

将接口与实现分离是一个好主意。它通常被称为封装

但它没有提到什么是实施

循环的
缩写,它是
的…的

不,
for…of
不是(…;…;…)
循环的正常
的简写。这是一个完全独立的机制

为什么我们需要定义
矩阵算子
函数来迭代
矩阵
的内容?。这是不是因为每当您为
的…使用
时,都会使用JS中每个对象的
[Symbol.iterator]

对。我们定义
MatrixIterator
,因为它符合迭代器接口,这是由
Symbol.iterator
方法返回的,可以在这样的循环中使用

当然,有其他方法可以实现这一点,我们不一定需要额外创建一个
MatrixIterator
类。发电机功能通常是最简单的

我通常在另一个
for
的内部使用
for
来迭代二维矩阵的内容

当然,但这是相当大的语法开销——两个循环,两个计数器,双缩进。它可以简单得多,我们不想在迭代矩阵时到处重复这种模式。iterable接口允许这样做

假设标准的
[Symbol.iterator]
不能自动迭代二维对象,对吗

没有标准的
符号。迭代器
方法。每种类型都需要自己定义<例如,prototype
可以,但它只在数组上工作,而不在我们的
矩阵
类上工作


我们是否可以这样做:
Matrix.prototype[Symbol.iterator]=MatrixIterator


这是行不通的,因为
MatrixIterator
a)是一个构造函数,需要用
new
b)调用矩阵实例,它应该作为一个参数迭代

投票关闭,因为这是一次3-4个问题。。。首先,是的,for
循环的
不知道如何在
矩阵上迭代,因此需要自定义
符号。迭代器
。不过,这是一个愚蠢的玩具示例,通常是针对要对整个矩阵进行乘法或其他运算的矩阵。是否允许我们这样做:
matrix.prototype[Symbol.iterator]=MatrixIterator
-这将不起作用,因为
MatrixIterator
不再引用矩阵对象(新矩阵运算符(this)
中的
this
)。也许可以用某种方式编写
MatrixIterator
,但它不会像代码那样干净或有用。我明白了,谢谢你的解释!@jnylenI明白了,谢谢你的回答。我想我错过了很多我应该知道的事情,你也这么认为吗?如果是,我应该读什么或关注什么关于?@WealthyPlayer不知道,我认为“雄辩的JavaScript”的课程很好。(至少第一版看起来合理,我没有读第二版)