Javascript 为什么存在对象键的forEach()方法而不存在数组键?

Javascript 为什么存在对象键的forEach()方法而不存在数组键?,javascript,node.js,Javascript,Node.js,如果我在节点(v10.15.3)中执行此操作: 我得到: gfg Object [Array Iterator] {} 如果我这样做: Array(3).keys() 我得到: gfg Object [Array Iterator] {} 所以我很明显有一种在某种意义上是可以接受的类型 但是, Array(3).keys().forEach(() => console.log('gfg')); “收益率”: TypeError: Array(...).keys(...).for

如果我在节点(v10.15.3)中执行此操作:

我得到:

gfg
Object [Array Iterator] {}
如果我这样做:

Array(3).keys()
我得到:

gfg
Object [Array Iterator] {}
所以我很明显有一种在某种意义上是可以接受的类型

但是,

Array(3).keys().forEach(() => console.log('gfg'));
“收益率”:

TypeError: Array(...).keys(...).forEach is not a function

当键从数组中派生时,为什么此iterable对象上不存在forEach函数?

这是因为
array.keys
不同

返回一个迭代器(或者,实际上是一个“数组迭代器”),它不公开任何数组原型,因为它不返回数组,尽管它可以循环:

for(数组(3.keys()的变量元素){
控制台日志(elem);
}
//如果你真的想用forEach。。。
forEach(k=>console.log('spread syntax->',k));
//或者使用Array.from

from(Array(3.keys()).forEach(k=>console.log('Array.from->',k))将其转换回数组,然后对其进行迭代
([…数组(3.keys()).forEach(()=>console.log('gfg'))
将forEach方法放在迭代器上是否有意义,或者这不是事情的工作方式?@PeterDavidCarter
forEach
是一种方法,迭代器只是一种不同的类型。Foreach是数组的原型方法,迭代器不是数组。您可以方便地使用扩展运算符或数组。但是,如果您想使用
forEach
,因为您可以使用迭代器构建数组(请参阅上面更新的代码),因此我们可以在迭代器上调用扩展运算符。。。??你能解释一下为什么这对我们有帮助吗?@PeterDavidCarter扩展运算符只是从
迭代器
或任何具有
[Symbol.iterator]
()的对象收集所有值。您混淆了迭代器和数组:它们是不同的类型。您可以将迭代器视为某种接口,允许某些内容能够循环。扩展语法(…)是收集iterable的所有值的简写,因此您可以使用扩展语法从interator构建数组。如果您愿意,我可以尝试给您进一步的解释,只是数组是iterable,而迭代器不是数组。两者都可以在for循环中循环,但forEach是一个数组方法
Array.keys
返回迭代器,它不返回数组,而
Object.keys
返回数组。两者都可以循环(因为它们可以方便地进行iterable,但是
数组。keys
不是数组,因此不能直接使用
.forEach
。请注意调用它们的方式不同;
对象。keys(obj)
调用
对象的静态方法,将对象作为参数传递。
数组(3)。keys()
正在创建一个数组,然后在实例上调用一个
keys()
方法。@charlietfl我的数组值都未定义。我从阅读的文档中得到的印象是。keys()不要忽略未定义的值,这就是我使用它的原因。检查这个答案它有所有的细节,所以数组原型有forEach方法,但迭代器没有。这对我来说似乎很奇怪…@PeterDavidCarter forEach是一个数组原型方法,只会在数组上而不会在对象上