我正在构建一个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
我在这里做错了什么,如何解决这个问题?
答案 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
未定义。但是,请注意任何涉及将theHref
与undefined
进行比较的解决方案,这不是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
}