所有JavaScript可重用文件都有next()方法吗?

所有JavaScript可重用文件都有next()方法吗?,javascript,arrays,iterator,iterable,Javascript,Arrays,Iterator,Iterable,我从中学习了Iterable,它清楚地表明数组是Iterable的。在chrome控制台中检查它,我们可以看到它有Symbol.iterator,我们可以在上面运行for..of 但是数组似乎没有遵循迭代器模式,即使用next()方法,这是我得到的,因为不能重置迭代器,这将严重限制数组 但是我很难从文档中识别哪些Iterables有完整的实现(next()),哪些没有,或者我这里缺少了一个基本概念 我遗漏了什么?我想你遗漏的是迭代器和可迭代的东西之间存在差异 数组是可迭代的,但不是迭代器。您可以

我从中学习了Iterable,它清楚地表明数组是Iterable的。在chrome控制台中检查它,我们可以看到它有
Symbol.iterator
,我们可以在上面运行
for..of

但是数组似乎没有遵循迭代器模式,即使用
next()
方法,这是我得到的,因为不能重置迭代器,这将严重限制数组

但是我很难从文档中识别哪些Iterables有完整的实现(next()),哪些没有,或者我这里缺少了一个基本概念


我遗漏了什么?

我想你遗漏的是迭代器和可迭代的东西之间存在差异

数组是可迭代的,但不是迭代器。您可以从数组中获取迭代器,这就是它的可重用性:

//iterable
设arr=[1,2,3,4]
//Symbol.iterator函数返回迭代器
让它=arr[Symbol.iterator]()
//迭代器有next()
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())

console.log(it.next())
Mark Meyer的回答帮助您了解iterable和迭代器之间的关键区别

如果您想使自己的值可编辑,则必须实现
Symbol.iterator
-

类正方形{
构造函数(…值){
this.values=values
}
*[Symbol.iterator](){
for(此值的常数v)
收益率v*v
}
}
常量=
新方块(1,2,3,4,5)
for(iterable的常数v)
控制台日志(v)
// 1
// 4
// 9
// 16
// 25
console.log(Array.from(iterable))

//[1,4,9,16,25]
。这澄清了问题。你能评论一下这种奇怪的订阅语法吗<代码>arr[Symbol.iterator]()?为什么我们要把Symbol.iterator放在方括号内?@TomAuger--是一个。括号表示法只是对使用Symbol.iterator返回的键返回函数的数组的属性查找。这样可以保证密钥是唯一的。不像字符串
数组[“迭代器”]
那样,您可能会意外地覆盖它。JS内置了一些“众所周知的符号”——当然,您也可以创建自己的符号。发布了一个后续问题,以加深我对这个特定实现原因的理解:除了上面的
*[Symbol.iterator](){
之外,是否可以创建一个更传统的命名方法,比如
*getIterator(){
?还是有一些幕后的“魔法”与
Symbol.iterator
关联,使其在引擎盖下工作?您可以将方法命名为
getIterator
,但按惯例使用,以利用其他JavaScript功能,如
Array.from
中的语法等。有关详细信息,请参阅
Symbol.iterator
上的文档。