O / P的Javascript代码

时间:2012-10-01 13:37:42

标签: javascript

在下面的JavaScript代码中: -

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

}

我得到o / p as - $ family,$ constuctor,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对象的属性(也是索引)吗?

1 个答案:

答案 0 :(得分: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和你好。

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

var a = [9, 2];

等同于这个对象(加上从Array继承的东西):

var a = {
    0: 9,
    1: 2
}