Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";无法读取属性';长度';“未定义”的定义;检查变量时';s长度_Javascript - Fatal编程技术网

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
}