2

javascript代码示例:

function a() {
    this.array1 = [];
    this.addToArray = function(name) {
        this.array1.push(new b(name));
        return true;
    }
    this.searchForName = function(name) {
        for(var i in this.array1) {
            alert(i.name);
        }
    }
    function b(name) {
        this.name = name;
    }
}

我将此 javascript 文件包含在一个 html 文档中。在 html 文档的脚本标签内,我有以下代码:

var myObject = new a();
myObject.addToArray("test1");
myObject.searchForName("test1");

运行此代码,我希望"test1"其中会弹出一个警报,但它会以未定义的形式弹出。然而,Chrome 中的调试器显示 myObject 内部有一个数组,其中包含名为"test1". 当我使用断点测试代码时,它显示在调用警报的那一刻,i.name 是 undefined。这有什么问题?

4

2 回答 2

2

您正在寻找数字而不是成员中的name属性。iithis.array

所以:

i.name

应该:

this.array1[i].name

结果是:

this.searchForName = function(name) {
    for(var i in this.array1) {
             // get it from this array1
        alert(this.array1[i].name);
    }
}

工作示例:http: //jsfiddle.net/seNxD/

for-in此外,如果您只对数字索引感兴趣,则使用语句不是一个好主意。声明是要使用的for,因为您没有枚举。

于 2011-01-30T20:27:22.850 回答
2

for...in切勿使用(MDC 文档描述原因)遍历数组。使用正常for循环:

for(var i = this.array1.length;i--;) {
    alert(this.array1[i].name);
}

for...in无论如何循环对象的,这将是数组的索引。因此,循环的循环体for...in必须看起来与上面显示的循环完全相同for

例如,for...in如果你有这个,你会使用:

var obj = {foo: 'bar', answer: '42'};
for(var key in obj) {
    alert(key + " is " + obj[key]);
}

进一步说明:约定以大写字母开头构造函数的名称。

于 2011-01-30T20:28:38.393 回答