1

我目前正在做关于 Javascript 的 Codeacdemy 教程,在做 Object 教程时,我一直在为以下内容不确定:

    // Our Person constructor
function Person (name, age){
    this.name = name;
    this.age = age;
}

// Now we can make an array of people
var family = [];
family[0] = Person("alice", 40);
family[1] = Person("bob", 42);
family[2] = Person("michelle", 8);
family[3] = Person("timmy", 6);

// loop through our new array
for(var person in family){
    console.log("name: "+person.name);
}

我之前遇到过 codecademy 的问题,所以我在自己的网页中尝试过,但仍然未定义。谁能向我解释为什么。我也尝试过使用family[0].name,这也是未定义的

4

5 回答 5

4

for-in 循环返回索引,而不是值。如果将其更改为console.log("name: "+family[person].name),它将按预期工作。

for(var person in family){
    console.log(person);
    console.log("name: "+person.name);
}
0
name: undefined
1
name: undefined
2
name: undefined
3
name: undefined

正如@basilikum 还提到的,您需要使用new关键字创建每个人,否则他们将不是对象。

console.log(Person("alice", 40));     // undefined
console.log(new Person("alice", 40)); // Person {name: "alice", age: 40}
于 2013-06-22T16:15:13.237 回答
2

用于.push()动态添加新的数组成员,因此替换以下代码:

family[0] = Person("alice", 40);

对于这个:

family.push( Person("alice", 40) );
于 2013-06-22T16:15:28.373 回答
2

您需要使用new关键字创建对象:

family[0] = new Person("alice", 40);

Person只是一个功能。如果你调用它,你会收到这个函数返回的任何东西。由于它不返回任何内容,因此您的所有条目都是未定义的。通过使用new,您将此函数作为构造函数调用,它使用您定义的属性创建一个新对象并返回该对象。

正如 SpenserJ 所说,您还必须记住,for循环只返回键而不是实际对象。

于 2013-06-22T16:15:54.687 回答
1

JavaScript 中的 foreach 循环提供数组键而不是值。通过使用family[person].name而不是person.name,代码应该可以工作。

编辑:创作中new似乎也缺少该关键字。Person

于 2013-06-22T16:15:20.060 回答
0

因此,我在代码学院练习中尝试了family[person].name,但没有成功。

关于代码学院的事情是,他们正在寻找与他们迄今为止所教你的内容相关的答案。我的男朋友是sr。软件工程师和 .push tack 将完全适用于日常编码世界!但他们还没有教我们。所以,当我将它插入代码学院时,仍然没有让我通过。哈哈。

相反,我这样做了:

var family = new Array();
family[0] = new Person("alice", 40);
family[1] = new Person("bob", 42);
family[2] = new Person("michelle", 8);
family[3] = new Person("timmy", 6);


     for ( i = 0; i < family[4] ; i++ );

        console.log(family[0].name);
        console.log(family[1].name);
        console.log(family[2].name);
        console.log(family[3].name);

它奏效了......我敢肯定还有其他方法(希望更短)来做到这一点......

于 2013-10-17T20:50:09.807 回答