in语句的Javascript

in语句的Javascript,javascript,arrays,for-in-loop,Javascript,Arrays,For In Loop,我试图用javascript输出数组的键,如下所示: data=[8, 4, 6, 9, 5, 2, 4, 6]; for(i in data){console.log(i);} 但它不是只输出键,而是输出以下内容: 0 1 2 3 4 5 6 7 $family each clean associate link contains extend getLast getRandom include combine erase empty flatten hexToRgb rgbToHex mi

我试图用javascript输出数组的键,如下所示:

data=[8, 4, 6, 9, 5, 2, 4, 6];
for(i in data){console.log(i);}
但它不是只输出键,而是输出以下内容:

0
1
2
3
4
5
6
7
$family
each
clean
associate
link
contains
extend
getLast
getRandom
include
combine
erase
empty
flatten
hexToRgb
rgbToHex
min
max
average
sum
unique
shuffle

为什么??在输出数组键之后,如何使其停止?

这是因为数组是对象,对于迭代属性,而不是数组索引。您可以这样做:
data.forEach(函数(a,i){console.log(i);})
或者您可以检查属性并查看它们是否“在”数组中。prototype

这是因为数组是对象,for in迭代属性,而不是通过数组索引。您可以这样做:
data.forEach(函数(a,i){console.log(i);})
或者您可以检查属性并查看它们是否“在”数组中。prototype

使用一个“普通”的
来代替
循环:

for(var i = 0; i < data.length; i++) {
    console.log(data[i]);
}
for(变量i=0;i
JavaScript的
for…in
构造迭代对象的所有属性,因此您可以获得
数组上的所有属性/方法。prototype
(事实上,它将一直沿着prototype链向上)以及您期望的元素。

使用一个“普通”的
来代替
循环:

for(var i = 0; i < data.length; i++) {
    console.log(data[i]);
}
for(变量i=0;i

JavaScript的
for…in
构造迭代对象的所有属性,因此您可以在
数组中获得所有属性/方法。prototype
(事实上,它将一直沿着prototype链)以及您期望的元素。

A
for..in
循环遍历对象的所有可枚举属性。我不知道所有这些额外属性是如何在您的数组中定义的-您是否正在使用一个库将它们添加到
array.prototype

您应该使用传统的for循环遍历数组的数字索引项-这将自动忽略任何其他属性。如果您只想输出索引,则如下所示:

for (var i=0; i < data.length; i++) {
   if (typeof data[i] !== "undefined")
      console.log(i);
}
for(变量i=0;i
请注意,
.length
返回的索引比最高定义的索引高一个,但这并不意味着所有较低的索引实际上都有一个值,因此我检查了每个项是否未定义。如果undefined是数组中的一个有效值,您可以删除它——实际上,我很少使用带有“洞”的数组,但我提到它是为了完整性


另外,您可以使用,但较旧的浏览器不支持。

A
for..in
循环遍历对象的所有可枚举属性。我不知道所有这些额外属性是如何在您的数组中定义的-您是否正在使用一个库将它们添加到
array.prototype

您应该使用传统的for循环遍历数组的数字索引项-这将自动忽略任何其他属性。如果您只想输出索引,则如下所示:

for (var i=0; i < data.length; i++) {
   if (typeof data[i] !== "undefined")
      console.log(i);
}
for(变量i=0;i
请注意,
.length
返回的索引比最高定义的索引高一个,但这并不意味着所有较低的索引实际上都有一个值,因此我检查了每个项是否未定义。如果undefined是数组中的一个有效值,您可以删除它——实际上,我很少使用带有“洞”的数组,但我提到它是为了完整性


另外,您可以使用,但较旧的浏览器不支持它。

除非他使用
delete
删除元素,否则所有元素都将有一个值,
undefined
也是一个有效值。因此,通常未定义的检查是不正确的necessary@ThiefMaster-对于问题中的样本,这不会是一个问题,但我试图提供一个更一般的答案。如果你说
varx=[];x[20]=真索引20以下的所有元素都没有值,不使用
delete
。但是很少用这种方式编写代码,是的,undefined可能是一个有效值,这就是为什么我注意到,如果不需要,可以删除该测试。在这种情况下,它应该是一个对象而不是数组;)@小偷主人-我同意。但是如果你看一下
Array.forEach()
的实现,你会发现它允许已删除或从未设置的元素,所以显然有些人在某处使用数组更像对象……是的。。但这并不能让它变得更好。在我玩的一个游戏中,开发人员将数据放入
somevar[999999]
——当然它不是一个对象,而是一个数组。。他甚至在这个巨大的数组上循环。除非他使用
delete
删除元素,否则所有元素都会有一个值,
undefined
也是一个有效值。因此,通常未定义的检查是不正确的necessary@ThiefMaster-对于问题中的样本,这不会是一个问题,但我试图提供一个更一般的答案。如果你说
varx=[];x[20]=真索引20以下的所有元素都没有值,不使用
delete
。但是很少用这种方式编写代码,是的,undefined可能是一个有效值,这就是为什么我注意到,如果不需要,可以删除该测试。在这种情况下,它应该是一个对象而不是数组;)@小偷主人-我同意。但是如果你看一下
Array.forEach()
的实现,你会发现它允许已删除或从未设置的元素,所以显然有些人在某处使用数组更像对象……是的。。但这并不能让它变得更好。在我玩的一个游戏中,开发人员将数据放入
somevar[999999]
——当然它不是一个对象,而是一个数组。。他甚至在这个巨大的数组上循环。注意,由于缺乏浏览器支持,我不推荐使用
forEach
。如果您需要支持所有主流浏览器,甚至不必考虑在几个月内提供可靠的本机
forEach
支持