0

我正在尝试在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

为什么?输出数组键后如何让它停止?

4

3 回答 3

2

改用“正常”for循环:

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

JavaScript 的for...in构造会迭代对象的所有属性,因此您可以获得所有属性/方法Array.prototype(实际上,它将一直沿原型链向上)以及您期望的元素。

于 2011-12-20T00:27:49.730 回答
1

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

于 2011-12-20T00:27:10.050 回答
1

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

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

for (var i=0; i < data.length; i++) {
   if (typeof data[i] !== "undefined")
      console.log(i);
}

请注意,.length返回的索引比定义的最高索引高一个,但这并不意味着所有较低的索引实际上都有一个值,所以我已经检查了每个项目是否未定义。如果 undefined 是数组中的有效值,您可以删除它 - 实际上我很少使用其中带有“孔”的数组,但我提到它是为了完整性。

PS您可以使用.forEach(),但旧浏览器不支持它。

于 2011-12-20T00:29:26.720 回答