变量未定义用于某些目的,为其他目的定义

时间:2013-01-23 17:13:52

标签: javascript variables console

我想看看NewEgg产品ID的格式,所以我们从他们的主页上尝试运行以下脚本,将所有链接产品的ID吐出到控制台:

for (var i=0;i<document.links.length;i++) {
    if (document.links[i].href.indexOf("Product.aspx")!=-1) {
        var itemNo=document.links[i].href.split("Item=")[1];
        console.log(itemNo);
    }
}

(如您所见,产品链接中包含“Product.aspx”,后跟?Item=[itemid]。简单split以获取?Item=之后的部分。这个脚本运行正常。但是,当我试图获得“发烧友”时,我开始收到itemNo未定义的错误消息。这是我试过的脚本:

for (var i=0;i<document.links.length;i++) {
    if (document.links[i].href.indexOf("Product.aspx")!=-1) {
        var itemNo=document.links[i].href.split("Item=")[1];'
        if (itemNo.charAt(0)=="N") {//look at only IDs that start with 'N'
            console.log(itemNo);
        }
    }
}

这报告在第二个if语句(上面第四行的内部if)中未定义itemNo。评论if声明(第4和第6行)使它再次正常工作。基本上,我可以记录它,但我不能if它。在记录之前我还尝试了一些字符串操作来代替if,但是在定义itemNo的行之后,除了记录它之外我做不了多少。我尝试更改变量名称无效。

不可否认,这是来自Firebug控制台(也尝试过Firefox的原生Scratchpad),因此环境有点不同,但我认为没有理由为什么有时应该定义变量,但其他时候未定义。

3 个答案:

答案 0 :(得分:2)

这实际上并不是Firebug的问题。如果您尝试以下操作:

for (var i=0;i<document.links.length;i++) {
    if (document.links[i].href.indexOf("Product.aspx")!=-1) {
        // Added log
        console.log(document.links[i].href);

        var itemNo=document.links[i].href.split("Item=")[1];
        if (itemNo.charAt(0)=="N") {
            console.log(itemNo);
        }
    }
}

您会注意到第一个链接在查询字符串中有Item=。因此,当您尝试拆分href时,您将返回undefined,然后尝试运行charAt(),这当然会引发TypeError。

基本上,您没有检查undefined。一个简单的检查应该这样做:

for (var i=0;i<document.links.length;i++) {
    if (document.links[i].href.indexOf("Product.aspx")!=-1) {
        var itemNo=document.links[i].href.split("Item=")[1];
        // Right here
        if (itemNo && itemNo.charAt(0)=="N") {
            console.log(itemNo);
        }
    }
}

答案 1 :(得分:1)

问题在于您的搜索条件。

正如您所看到的,某些链接具有“Product.aspx”但不是产品的链接,如下所示: “http://www.newegg.com/Store/NewProduct.aspx?Name=What%27s-New”

你应该更加具体,如:

for (var i=0;i<document.links.length;i++) {
    if (document.links[i].href.indexOf("/Product.aspx?")!=-1) {
        // Added log
        console.log(document.links[i].href);

        var itemNo=document.links[i].href.split("Item=")[1];
        if (itemNo.charAt(0)=="N") {
            console.log(itemNo);
        }
    }
}

答案 2 :(得分:0)

查看第一个脚本的第一个结果(工作正常)。这是未定义的。这就是你的第二个脚本出错的原因。

你应该重写它,检查itemNo是否未定义:

for (var i=0;i<document.links.length;i++) {
if (document.links[i].href.indexOf("Product.aspx")!=-1) {
    var itemNo=document.links[i].href.split("Item=")[1];
    if (itemNo!=undefined&&itemNo.charAt(0)=="N") {//look at only product ideas that start with N
        console.log(itemNo);
    }
}

}