Javascript 为什么存在对象键的forEach()方法而不存在数组键?
如果我在节点(v10.15.3)中执行此操作: 我得到: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
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方法放在迭代器上是否有意义,或者这不是事情的工作方式?@PeterDavidCarterforEach
是一种方法,迭代器只是一种不同的类型。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是一个数组原型方法,只会在数组上而不会在对象上