开发者问题收集

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