以下是代码学院的编码练习,其目的是打印名称属性。您能否解释一下错误以及如何解决该错误。我的代码如下所示:
// Our Person constructor
function Person(name, age) {
this.name = name;
this.age = age;
}
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 (var i = 0; i <= family.length; i++) {
console.log (family[i].name);
};
// Now we can make an array of people
// loop through our new array
OUTPUT :
alice
bob
michelle
timmy
---
We're running a test below to make sure your code works.
alicebobmichelletimmy
TypeError: Cannot read property 'name' of undefined
------------------------------------------
Many thanks.
在循环中,您耗尽了数组的边界。考虑以下。
我有一个由3个项目组成的数组,索引为0、1、2。如果将<=
运算符用于条件循环,它将产生以下结果:0、1、2、3。由于3不存在,因此未定义,并且它找不到属性名称。
数组从0开始,这意味着索引从零开始。如果我们有一个包含3个元素的数组,则长度为3,但最大索引为2(0、1、2)。如果for循环即使索引等于长度也继续循环,则它将返回undefined,因为数组中的该元素不存在。
在您的情况下,您在一个数组中有4个元素,所有Person对象。它们通过索引0、1、2和3进行访问。如果循环在3之后继续并检查是否i
等于长度(4),它将尝试检查数组的第4个元素,而不是之所以存在,是因为带有元素的数组长度只有4个,而不是5个。
像这样重写for循环:
for (var i = 0; i < family.length; i++) {
console.log (family[i].name);
};
这将防止循环迭代到未知索引。当所有元素都循环通过时,它将停止循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句