Javascript:循环使用 TypeError 属性未定义的对象
2017-06-09
420
我有一个名为
xs
的对象数组,用于存储名称
xs = [
{name: "Peter"},
{name: "Doe"},
{name: "Parker"},
{name: "John"}
];
并且我有一个函数 setEmptyStr,如果变量未定义,则返回空字符串
function setEmptyStr(v) {
if(typeof v !== 'undefined'){
return v;
} else {
return '';
}
}
我尝试循环我的对象数组(长度大于数组本身),我的数组长度为 4,我尝试 5。我不想使用 array.length;
for (var i = 0; i < 5; i++) {
console.log(setEmptyStr(xs[i].name));
}
这 4 个名称成功返回,因为它不是未定义的。但是第 5 个返回
TypeError property 'name' is undefined.
>>Peter
>>Doe
>>Parker
>>John
Uncaught TypeError: Cannot read property 'name' of undefined
我希望第 5 个返回一个空字符串。我该怎么做?我的代码有错误吗?
>>Peter
>>Doe
>>Parker
>>John
>>""
3个回答
使用此功能:
xs = [
{name: "Peter"},
{name: "Doe"},
{name: "Parker"},
{name: "John"}
];
for (var i = 0; i < 5; i++) {
console.log(setEmptyStr(xs[i] && xs[i].name));
}
function setEmptyStr(v) {
if (typeof v !== 'undefined') {
return v;
} else {
return '';
}
}
首先测试
xs[i]
可防止因尝试访问
undefined
的属性而出现错误。
Barmar
2017-06-09
不,您的代码中没有错误,但循环索引高于其长度的数组是不安全的,它会引发这种错误。
在您的代码中
xs[4]
将是
undefined
,这就是您收到此错误的原因:
Uncaught TypeError: Cannot read property 'name' of undefined
因此,您只需捕捉并避免此错误,如下所示:
for (var i = 0; i < 5; i++) {
if(xs[i])
console.log(setEmptyStr(xs[i].name));
}
cнŝdk
2017-06-09
没有 name 未定义:
Uncaught TypeError: Cannot read property 'name' of undefined
因此实际上 xs[i] 未定义。您的循环运行了 5 次,但您只有 4 个元素。您可以使用 .length 来确保:
for(var i=0;i<xs.length;i++)
Jonas Wilms
2017-06-09