开发者问题收集

无法读取未定义错误的属性“replace”

2015-12-21
1696

如果某些数组元素为 undefined ,我尝试将其全部转换为 null

console.log(MyThing[7]); //undefined.

for (var i = 0; i < 8; i++) {
  if ($(".row.mine") != null) {
    if (typeof MyThing[i] === undefined) {
      MyThing[i] = null;
    } else {
      MyThing[i] = MyThing[i].replace(/Aa.*/, '').replace("-", "");
    }
  } else {
    if (typeof MyThing[i] === undefined) {
      MyThing[i] = null;
    }
  }
}

但这会给出错误 无法读取未定义的属性“replace” 。因此,如果元素为 undefined ,则不会转换。我应该如何更改代码来实现此目的?

3个回答

typeof MyThing[i] === undefined 始终为 false,因为 typeof 运算符始终返回字符串。请使用下列之一:

typeof MyThing[i] === 'undefined'
MyThing[i] === undefined

此外,这不会检查值是否为 null (因为 typeof null === 'object' )。据我所知,您可以拥有 null 值,因此您遇到的下一个错误可能是 无法读取 null 的属性“replace”

我建议您直接检查字符串类型:

if ($(".row.mine") != null) {
  if (typeof MyThing[i] !== 'string') {
    MyThing[i] = null;
  } else {
    MyThing[i] = MyThing[i].replace(/Aa.*/, '').replace("-", "");
  }
} else {
  if (typeof MyThing[i] !== 'string') {
    MyThing[i] = null;
  }
}
Tamas Hegedus
2015-12-21

typeof MyThing[i] === undefined 应为 MyThing[i] === undefinedtypeof MyThing[i] === 'undefined' ,因为 typeof 始终为您提供一个 string

但在您的上下文中,我只会使用 undefined 为 false 的事实:

if (!MyThing[i]) {
  MyThing[i] = null;
} else {
  MyThing[i] = MyThing[i].replace(/Aa.*/, '').replace("-", "");
}

除非 MyThing[i] 可能为 "" 并且您不希望将其转换为 null

或者以肯定的方式表达:

if (MyThing[i]) {
  MyThing[i] = MyThing[i].replace(/Aa.*/, '').replace("-", "");
} else {
  MyThing[i] = null;
}

但同样,请注意有关 "" 的事情。

T.J. Crowder
2015-12-21

我猜这是一个拼写错误,请尝试将 undefined 放在引号内:

 if (typeof MyThing[i] === 'undefined') {
I am L
2015-12-21