Javascript在检查变量的长度时“无法读取未定义的属性'长度'”
Javascript "Cannot read property 'length' of undefined" when checking a variable's length
我正在构建一个使用cheerio
来解析DOM
的node
抓取器。不过,这更像是一个普通的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
在这里做错了什么,我该如何解决这个问题?
您可以通过检查未定义来检查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_
}
为什么?
你问为什么会这样,让我们看看:
官方语言特定规定调用内部[[GetValue]]
方法。您的.attr
返回未定义,并且您正在尝试访问其长度。
如果 Type(V( 不是引用,则返回 V。
这是真的,因为undefined不是引用(与null,数字,字符串和布尔值一起(
让 base 成为调用 GetBase(V( 的结果。
这得到了myVar.length
undefined
部分。
如果 IsUnresolvevableReference(V(,则引发 ReferenceError 异常。
这是不正确的,因为它是可解析的,并且解析为未定义。
如果 IsPropertyReference(V(,则
发生这种情况是因为它是具有.
语法的属性引用。
现在,它尝试将undefined
转换为导致类型错误的函数。
空字符串""
和未定义的变量之间存在差异。您应该检查 Href 是否包含定义的字符串,而不是其长度:
if(theHref){
// ---
}
如果您仍要检查长度,请执行以下操作:
if(theHref && theHref.length){
// ...
}
除了其他人的建议之外,还有另一种选择来处理这个问题。
如果你的应用程序在缺少"href
"属性的情况下应该表现相同,就像在它为空的情况下一样,只需替换它:
var theHref = $(obj.mainImg_select).attr('href');
有了这个:
var theHref = $(obj.mainImg_select).attr('href') || '';
如果尚未找到该属性,则将空字符串 ( ''
( 视为默认值。
但这实际上取决于你如何处理未定义的"href
"属性。此答案假设您希望将其视为空字符串进行处理。
如果你没有对 length 属性进行某种数字比较,最好不要在 if 语句中使用它,只需执行以下操作:
if(theHref){
// do stuff
}else{
// do other stuff
}
空(或未定义,在这种情况下(字符串的计算结果为 false(就像长度为零一样(。
正如在其他地方所讨论的,.length
属性引用失败,因为theHref
未定义。但是,请注意任何涉及将theHref
与undefined
进行比较的解决方案,这不是JavaScript中的关键字,可以重新定义。
有关检查未定义变量的完整讨论,请参阅检测未定义的对象属性,特别是第一个答案。
您可以简单地检查元素长度是否未定义,只需使用
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
}
- TypeError:无法读取属性'推'未定义的JavaScript
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 未捕获的类型错误:无法读取属性'删除'的未定义
- AngularJS指令出错-无法读取属性'编译'的未定义
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- angularjs无法读取未定义的属性then
- 无法读取属性'材料'未定义的Three.js
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- JavaScript承诺-无法读取属性'那么'的未定义
- 未捕获的类型错误:无法读取属性'中止'的未定义
- 角度推入数组给出:TypeError:无法读取属性'推'的未定义
- Javascript未捕获类型错误:无法读取属性'0'的未定义
- jQuery控制台错误:无法读取属性'top'的未定义
- TypeError:无法读取属性'findAll'的未定义
- 无法读取属性'errcap'未定义的jqgrid
- 无法读取未定义的属性“rid”
- 未捕获的类型错误: 无法读取未定义的属性“图像”
- 可以't读取'getHTML'未定义的Liferay CK Editor内容
- 在node.js中未定义读取属性错误