I'm Gebäude ein node
scraper, die cheerio
verwendet, um die DOM
zu parsen. Dies ist mehr oder ein vanilla javascript Frage aber. In einem Teil meiner scrape, I' m Laden einige Inhalte in eine Variable, dann überprüfen die Variable' s "Länge", wie so:
var theHref = $(obj.mainImg_select).attr('href');
if (theHref.length){
// do stuff
} else {
// do other stuff
}
Das funktioniert ganz gut, bis ich auf eine URL stieß, für die $(obj.mainImg_select).attr('href')
nicht existierte. Ich nahm an, dass meine theHref.length
-Prüfung dies berücksichtigen und zur else: do other stuff
-Anweisung übergehen würde, aber stattdessen bekam ich:
TypeError: Cannot read property 'length' of undefined
Was mache ich hier falsch und wie kann ich das Problem beheben?
Sie können überprüfen, ob theHref
definiert ist, indem Sie gegen undefined prüfen.
if (undefined !== theHref && theHref.length) {
// `theHref` is not undefined and has truthy property _length_
// do stuff
} else {
// do other stuff
}
Wenn Sie sich auch gegen falsche Werte wie null
schützen wollen, dann prüfen Sie, ob theHref
wahrheitsgemäß ist, was etwas kürzer ist
if (theHref && theHref.length) {
// `theHref` is truthy and has truthy property _length_
}
Es besteht ein Unterschied zwischen einer leeren Zeichenkette und einer undefinierten Variablen. Sie sollten prüfen, ob theHref eine definierte Zeichenkette enthält oder nicht, und nicht ihre Länge:
if(theHref){
// ---
}
Wenn Sie trotzdem die Länge prüfen wollen, dann tun Sie dies:
if(theHref && theHref.length){
// ...
}
Wenn Sie nicht irgendeine Art von numerischem Vergleich der Längeneigenschaft durchführen, ist es besser, sie nicht in der if-Anweisung zu verwenden, sondern nur do:
if(theHref){
// do stuff
}else{
// do other stuff
}
Eine leere (oder undefinierte, wie in diesem Fall) Zeichenkette wird als falsch ausgewertet (genau wie eine Länge von Null.)