我目前正在使用Javascript进行Codeacdemy教程,在进行对象教程时,我发现以下内容未定义:
// 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
,这也是未定义的
答案 0 :(得分: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}
答案 1 :(得分:2)
使用.push()
动态添加新的数组成员,因此请替换以下代码:
family[0] = Person("alice", 40);
这个:
family.push( Person("alice", 40) );
答案 2 :(得分:2)
您需要使用new
关键字创建对象:
family[0] = new Person("alice", 40);
Person
只是一个功能。如果你调用它,你会收到此函数返回的任何内容。由于它不返回任何内容,因此所有条目都是未定义的。通过使用new
,您将此函数称为构造函数,它使用您定义的属性创建一个新对象并返回该对象。
正如SpenserJ所说,你还必须记住,for
循环只返回键而不是实际的对象。
答案 3 :(得分:1)
JavaScript中的foreach循环提供数组键而不是值。使用family[person].name
代替person.name
,代码应该有效。
修改:new
创作中似乎也缺少Person
关键字。
答案 4 :(得分:0)
所以,我在代码学院练习中尝试了 family [person] .name ,但它没有用。
关于代码学院的事情是,他们正在寻找一个答案,具体到他们教你到目前为止。我的bf是sr。软件工程师和.push大头钉将完全适用于日常编码世界!但他们还没有告诉我们。所以,当我把它插入代码学院时仍然没有让我通过。大声笑。
相反,我这样做了:
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);
它有效......我确信还有其他方法(希望更短)来做到这一点......