0

在下面的 JavaScript 代码中:-

var a  = [];
for (i in a) {
  alert(i);

}

我得到 o/p 为 - $family、$constructor、each、clone、clean、invoke、associate、link、contains、append、getlast、getRandom、include、combine、erase、empty、flatten、pick、hexToRgb、rgbToHex。

任何人都可以解释为什么会这样吗?它是否与 Array 对象的属性有关,如果是这样,那么为什么不提醒所有属性?此外,如果我们采用像 var a = {} 这样的空对象字面量,我们不会得到任何 o/p。

现在,如果我将上面的代码更改为:-

var a  = [9,2];
for (i in a) {
    if (a.hasOwnProperty(i)) {
        alert(a.hasOwnProperty(i));
        alert(i);
      }
} 

我得到的输出为 0 和 1。为什么会这样?这些是这个 Array 对象的属性(也是索引)吗?

4

1 回答 1

3

for-in 语法用于对象。它迭代对象的所有字段,包括方法。当你想迭代一个数组时,总是使用这个:

for (var i = 0; i < array.size; i++) {
    doSomething(array[i]);
}

您的后一个循环hasOwnProperty不会遍历数组的标准方法,因为您的数组a从基 Array 类继承了这些方法,因此它们不是它自己的属性。但是当你明确地向数组添加一个方法时,它也应该列出该函数,因为它现在是一个自己的属性:

var a  = [9,2];
a.hello = function() { };

for (i in a) {
    if (a.hasOwnProperty(i)) {
        alert(a.hasOwnProperty(i));
        alert(i);
      }
} 

这应该列出 0、1 和 hello。

如果您希望它输出 9 和 2,而您想知道为什么它输出 0 和 1:那是因为 for-in 数组迭代的是键,而不是值。数组基本上是对象,其中每个数组元素都是以数组索引为名称的属性。所以

var a = [9, 2];

相当于这个对象(加上继承自 Array 的东西):

var a = {
    0: 9,
    1: 2
}
于 2012-10-01T13:45:12.077 回答