28

我正在构建一个node用于cheerio解析DOM. 不过,这更像是一个普通的 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

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

4

7 回答 7

54

您可以theHref通过检查undefined来检查已定义。

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

如果您还想保护自己免受虚假值的影响,例如nullcheck theHrefis truthy,它会更短一些

if (theHref && theHref.length) {
    // `theHref` is truthy and has truthy property _length_
}
于 2013-07-11T00:58:36.627 回答
6

为什么?

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

官方语言规范要求调用内部方法[[GetValue]]。您的.attr退货未定义,您正在尝试访问它的长度。

如果 Type(V) 不是 Reference,则返回 V。

这是真的,因为 undefined 不是引用(除了 null、数字、字符串和布尔值)

设 base 为调用 GetBase(V) 的结果。

undefined得到myVar.length.

如果 IsUnresolvableReference(V),则抛出 ReferenceError 异常。

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

如果 IsPropertyReference(V),则

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

现在它尝试转换为导致 TypeErrorundefined的函数。

于 2013-07-11T01:11:38.707 回答
4

""空字符串和未定义的变量是有区别的。您应该检查 theHref 是否包含已定义的字符串,而不是其长度:

if(theHref){
   // ---
}

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

if(theHref && theHref.length){
   // ...
}
于 2013-07-11T00:59:18.647 回答
4

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

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

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

有了这个:

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

''如果尚未找到该属性,它将把空字符串 ( ) 作为默认值。

但这实际上取决于您要如何处理未定义的“ href”属性。此答案假定您将要处理它,就好像它是空字符串一样。

于 2013-07-11T01:04:16.463 回答
1

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

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

一个空的(或未定义的,在这种情况下)字符串将评估为假(就像长度为零一样。)

于 2013-07-11T00:58:57.943 回答
1

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

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

于 2013-07-11T01:02:31.177 回答
0

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

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
}
于 2019-10-08T06:37:03.593 回答