Javascript";无法读取属性';长度';“未定义”的定义;检查变量时';s长度
我正在构建一个Javascript";无法读取属性';长度';“未定义”的定义;检查变量时';s长度,javascript,Javascript,我正在构建一个节点scraper,它使用cheerio解析DOM。不过,这更像是一个普通的javascript问题。在我的一部分工作中,我将一些内容加载到变量中,然后检查变量的长度,如下所示: var theHref = $(obj.mainImg_select).attr('href'); if (theHref.length){ // do stuff } else { // do other stuff } 这很好用,直到我遇到一个url,$(obj.mainImg_selec
节点
scraper,它使用cheerio
解析DOM
。不过,这更像是一个普通的javascript问题。在我的一部分工作中,我将一些内容加载到变量中,然后检查变量的长度
,如下所示:
var theHref = $(obj.mainImg_select).attr('href');
if (theHref.length){
// do stuff
} else {
// do other stuff
}
这很好用,直到我遇到一个url,$(obj.mainImg_select).attr('href')
不存在。我假设我的theHref.length
检查可以解释这一点,并跳过else:do other stuff
语句,但我得到了:
TypeError:无法读取未定义的属性“length”
我在这里做错了什么?我如何解决这个问题?您可以通过检查undefined来检查href是否已定义 如果您还想保护自己不受诸如
null
之类的虚假值的影响,请选中theHref
is truthy,它稍微短一点
if (theHref && theHref.length) {
// `theHref` is truthy and has truthy property _length_
}
如果您没有对length属性进行某种数值比较,最好不要在If语句中使用它,只需执行以下操作:
if(theHref){
// do stuff
}else{
// do other stuff
}
空字符串(或未定义的字符串,在本例中是这样)的计算结果将为false(就像长度为零一样)。空字符串
“”
和未定义变量之间存在差异。您应该检查href是否包含已定义的字符串,而不是其长度:
if(theHref){
// ---
}
如果仍要检查长度,请执行以下操作:
if(theHref && theHref.length){
// ...
}
正如在其他地方讨论的那样,
.length
属性引用失败,因为theHref
未定义。但是,请注意任何涉及将theHref
与undefined
进行比较的解决方案,后者在JavaScript中不是关键字,可以重新定义
有关检查未定义变量的完整讨论,请参阅,特别是第一个答案。除了其他人的建议外,还有另一个解决该问题的选项 如果您的应用程序在缺少“
href
”属性的情况下表现相同,就像在它为空的情况下一样,只需替换以下内容:
var theHref = $(obj.mainImg_select).attr('href');
为此:
var theHref = $(obj.mainImg_select).attr('href') || '';
如果未找到属性,则会将空字符串(“”
)视为默认值
但这实际上取决于您希望如何处理未定义的“href
”属性。此答案假设您希望将其当作空字符串处理。为什么?
你问为什么会这样,让我们看看:
指示对内部[[GetValue]]
方法的调用。您的.attr
返回未定义的值,您正在尝试访问其长度
如果类型(V)不是引用,则返回V
这是正确的,因为undefined不是引用(与null、number、string和boolean一起)
让base作为调用GetBase(V)的结果
这将获取myVar.length
的未定义部分
如果IsUnsolvableReference(V),则引发ReferenceError异常
这是不正确的,因为它是可解析的,并且解析为未定义的
如果IsPropertyReference(V),则
这是因为它是一个具有
语法的属性引用
现在,它尝试将未定义的转换为函数。您只需使用
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
}
href
未定义,因此,您无法读取它的任何属性,例如length
。如果不清楚-这是cheerio中的一个bug,它说它的API应该与attr.Update中的jQuery相同,这不是bug,但在cheerio中被更改了,它现在遵守了较新的jQuery API,返回未定义的。请确保通过选择id或类名等正确附加事件。空和未定义意味着两个根本不同的事情。例如,像OP的示例(或web上的jQuery)中的ChereIO选择器的长度可以为0,但仍然不能计算为false。不过,OP正在计算字符串。从jQuery1.6开始,所有.attr()调用都会返回字符串或未定义。
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
}