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

时间:2013-07-11 00:56:02

标签: javascript

我正在构建一个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

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

7 个答案:

答案 0 :(得分:39)

您可以通过检查 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_
}

答案 1 :(得分:5)

为什么?

你问为什么它发生了,让我们看看:

official language specificaion指示调用内部[[GetValue]]方法。您的.attr返回undefined,并且您正在尝试访问其长度。

  

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

这是事实,因为undefined不是引用(与null,number,string和boolean一起)

  

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

这会获得undefined的{​​{1}}部分。

  

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

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

  

如果是IsPropertyReference(V),那么

这是因为它是带有myVar.length语法的属性引用。

现在它尝试将.转换为函数which results in a TypeError

答案 2 :(得分:4)

除了其他人的建议外,还有另一种方法可以解决这个问题。

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

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

用这个:

var theHref = $(obj.mainImg_select).attr('href') || '';
如果找不到该属性,

会将空字符串('')视为默认值。

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

答案 3 :(得分:3)

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

if(theHref){
   // ---
}

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

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

答案 4 :(得分:1)

如果你没有对length属性进行某种数值比较,最好不要在if语句中使用它,只需这样做:

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

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

答案 5 :(得分:1)

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

有关检查未定义变量的完整讨论,请参阅Detecting an undefined object property,特别是第一个答案。

答案 6 :(得分: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
}