我有一个名为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个名称返回成功,因为它未定义。但第五是回归
TypeError属性&#39; name&#39;未定义。
>>Peter
>>Doe
>>Parker
>>John
未捕获的TypeError:无法读取属性&#39; name&#39;未定义的
我希望第5个返回一个空字符串。我怎样才能做到这一点?我的代码中是否有错误?
>>Peter
>>Doe
>>Parker
>>John
>>""
答案 0 :(得分:0)
使用此:
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 '';
}
}
&#13;
首先测试xs[i]
可防止错误尝试访问undefined
的属性。
答案 1 :(得分:0)
不,你的代码中没有错误,但是在索引高于其长度的数组上循环是不安全的,它会引发这种错误。
在您的代码中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));
}
答案 2 :(得分:0)
没有名称未定义:
未捕获的TypeError:无法读取属性&#39; name&#39;未定义的
所以实际上 xs [i] 是未定义的。你的循环运行5次,但你只有4个元素。您可以使用 .length 来避免:
for(var i=0;i<xs.length;i++)
答案 3 :(得分:0)
下面,
for (var i = 0; i < 5; i++) {
console.log(setEmptyStr(xs[i].name));
}
您正在尝试发送单个数组元素的name
,而不检查其是否可用。在你的第5个条目中,你没有任何东西,所以它返回undefined
。因为你的数组长度是4.
所以在发送之前检查你是否有object
,
if(xs[i]) {
setEmptyStr(xs[i].name)
}