Javascript在检查变量的长度时“无法读取未定义的属性'长度'”

Javascript "Cannot read property 'length' of undefined" when checking a variable's length

本文关键字:未定义 读取 属性 长度 变量 检查 Javascript      更新时间:2023-09-26

我正在构建一个使用cheerio来解析DOMnode抓取器。不过,这更像是一个普通的javascript问题。在抓取的一部分,我将一些内容加载到变量中,然后检查变量的length,如下所示:

var theHref = $(obj.mainImg_select).attr('href');
if (theHref.length){
   // do stuff
} else {
  // do other stuff
}

这工作得很好,直到我遇到了一个不存在$(obj.mainImg_select).attr('href')的网址。我以为我的theHref.length检查会解决这个问题并跳到else: do other stuff语句,但我得到了:

TypeError: Cannot read property 'length' of undefined

在这里做错了什么,我该如何解决这个问题?

您可以通过检查未定义来检查theHref是否已定义。

if (undefined !== theHref && theHref.length) {
    // `theHref` is not undefined and has truthy property _length_
    // do stuff
} else {
    // do other stuff
}

如果您还想保护自己免受像null这样的错误值的影响,请检查theHref是真实的,这有点短

if (theHref && theHref.length) {
    // `theHref` is truthy and has truthy property _length_
}

为什么?

你问为什么会这样,让我们看看:

官方语言特定规定调用内部[[GetValue]]方法。您的.attr返回未定义,并且您正在尝试访问其长度。

如果 Type(V( 不是引用,则返回 V。

这是真的,因为undefined不是引用(与null,数字,字符串和布尔值一起(

让 base 成为调用 GetBase(V( 的结果。

这得到了myVar.length undefined部分。

如果 IsUnresolvevableReference(V(,则引发 ReferenceError 异常。

这是不正确的,因为它是可解析的,并且解析为未定义。

如果 IsPropertyReference(V(,则

发生这种情况是因为它是具有.语法的属性引用。

现在,它尝试将undefined转换为导致类型错误的函数。

空字符串""和未定义的变量之间存在差异。您应该检查 Href 是否包含定义的字符串,而不是其长度:

if(theHref){
   // ---
}

如果您仍要检查长度,请执行以下操作:

if(theHref && theHref.length){
   // ...
}

除了其他人的建议之外,还有另一种选择来处理这个问题。

如果你的应用程序在缺少"href"属性的情况下应该表现相同,就像在它为空的情况下一样,只需替换它:

var theHref = $(obj.mainImg_select).attr('href');

有了这个:

var theHref = $(obj.mainImg_select).attr('href') || '';

如果尚未找到该属性,则将空字符串 ( '' ( 视为默认值。

但这实际上取决于你如何处理未定义的"href"属性。此答案假设您希望将其视为空字符串进行处理。

如果你没有对 length 属性进行某种数字比较,最好不要在 if 语句中使用它,只需执行以下操作:

if(theHref){
   // do stuff
}else{
  // do other stuff
}

空(或未定义,在这种情况下(字符串的计算结果为 false(就像长度为零一样(。

正如在其他地方所讨论的,.length属性引用失败,因为theHref未定义。但是,请注意任何涉及将theHrefundefined进行比较的解决方案,这不是JavaScript中的关键字,可以重新定义。

有关检查未定义变量的完整讨论,请参阅检测未定义的对象属性,特别是第一个答案。

您可以简单地检查元素长度是否未定义,只需使用

var theHref = $(obj.mainImg_select).attr('href');
if (theHref){
   //get the length here if the element is not undefined
   elementLength = theHref.length
   // do stuff
} else {
   // do other stuff
}