搜索对象数组时,对象的属性未定义?

时间:2011-01-30 20:22:51

标签: javascript arrays object properties dynamic-arrays

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内部有一个数组,其中项目0的名称为"test1"。当我使用断点来测试代码时,它表明在调用警报时, i.name未定义。这有什么问题?

2 个答案:

答案 0 :(得分:2)

您正在寻找name号码上的i媒体资源,而不是i的{​​{1}}成员资格。

所以:

this.array

应该是:

i.name

结果是:

this.array1[i].name

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

另外,如果您只对数字索引感兴趣,那么使用this.searchForName = function(name) { for(var i in this.array1) { // get it from this array1 alert(this.array1[i].name); } } 语句并不是一个好主意。由于您没有枚举,因此使用for-in语句。

答案 1 :(得分:2)

永远不要使用for...inMDC documentation describes why)循环数组。使用普通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]);
}

进一步说明:通常以大写字母开始构造函数的名称。