javascript如果在控制台中给出“undefined”

时间:2014-01-18 16:47:22

标签: javascript if-statement

我确定我只是忽略了某些东西,但我看不出它是什么。

我有一个页面,我正在使用控制台测试一些新代码。大多数都有效。

    if(typeof(thisNode.L1.download) != 'undefined') {
    console.log('a1');
        if (thisNode.L1.download.sku.toString() == lastSku) {
            console.log('a2');
            addSku = thisNode.L1.cd.sku.toString();
        } else { console.log('a3'); }
    } else if(typeof(thisNode.S5.download) != 'undefined') {
        console.log('b1');
        if (thisNode.S5.download.sku.toString() == lastSku) {
            console.log('b2');
            addSku = thisNode.S5.cd.sku.toString();
        } else {
            console.log('b3');
        }
    }
    console.log('foo');

返回

    a1
    a3
    foo
    undefined

鉴于typeof(thisNode.S5.download) != 'undefined'返回true

lastSku返回"24536"

thisNode.S5.download.sku.toString()返回"24536"

这不是预期的。

我做了一些分解,看起来这是问题的初始if语句。

我进入控制台:if (thisNode.L1.download.sku.toString() == lastSku) {}我得到“未定义”

所以我一块一块地检查了它

lastSku返回"24536"

thisNode返回一个JSON对象。 Object {L1: Object, S2: Object, S3: Object, S5: Object}

thisNode.L1返回Object {box: Object, download: Object, cd: Object}

thisNode.L1.download返回Object {sku: 24354}

thisNode.L1.download.sku返回24354

thisNode.L1.download.sku.toString()返回"24354"

thisNode.L1.download.sku.toString() == lastSku返回false

    if (thisNode.L1.download.sku.toString() == lastSku) {
        console.log('foo');
    } else {
        console.log('bar');
    }

返回         “酒吧”         未定义

    if (thisNode.L1.download.sku.toString() == lastSku) {
       console.log('foo');
    } else {
        console.log('bar');
    }
    console.log('yabba');

返回

    bar
    yabba
    undefined

请注意,我可以将任何JavaScript放在原始if语句中,但仍然未定义,所以并不是没有代码可以跳过它。

总结一下,原始块似乎没有到达第7行,但它看起来像在运行第一组if语句之后,它确实在所有语句之后继续运行代码。

2 个答案:

答案 0 :(得分:3)

  

我进入控制台:if(thisNode.L1.download.sku.toString()== lastSku){}我得到“未定义”

这完全是预期的行为。

您看到的undefined(以及您在较大的代码示例中看到的最终undefined)只是Chrome的JS控制台输出最后一个语句评估的值,并且在JavaScript中, if语句不会计算为值。

在控制台上试试这个:

console.log('foo')

你会看到

foo
undefined

fooconsole.log输出,undefinedconsole.log的返回值。如果您查看undefined的左侧,您会看到一个灰色的<-箭头,表示这是代码导致的最后一个语句 not 输出的返回值

见下文:

enter image description here

这是REPL环境的典型行为。

答案 1 :(得分:0)

undefined是一只红色的鲱鱼,我无法停止看,这微薄的帮助让我终于看到了。

真正的问题是外部if..else if ... else if结构。它从未检查thisNode.S5的原因是因为我使用了

if(typeof(thisNode.L1.download) != 'undefined') {
    if (thisNode.L1.download.sku.toString() == lastSku) {
        //do stuff
    }
else if(typeof(thisNode.S5.download) != 'undefined') {
    if (thisNode.S5.download.sku.toString() == lastSku) {
        //do different stuff
    }
}

在第一个if内进行第二次检查是一个愚蠢的举动。我没在想。相反,我应该使用

if(typeof(thisNode.L1.download) != 'undefined' && thisNode.L1.download.sku.toString() == lastSku) {
    //do stuff
} else if(typeof(thisNode.S3.download) != 'undefined' && thisNode.S5.download.sku.toString() == lastSku) {
    //do different stuff
}