This question already has an answer here:
Console returns undefined [duplicate]
                                
                                    (1个答案)
                                
                        
                                4年前关闭。
            
                    
我确定我只是在俯视某件事,但看不到它是什么。

我有一个页面正在使用控制台来测试一些新代码。大部分有效。


    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语句后,它看起来确实确实在所有代码之后都保持了运行状态。

最佳答案

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


这完全是预期的行为。

您看到的undefined(以及在较大的代码示例中看到的最后一个undefined)只是Chrome的JS控制台输出最后一条语句求值的值,而在JavaScript中,if语句不输出求值。

在控制台上尝试:

console.log('foo')


你会看到的

foo
undefined


fooconsole.log输出,undefinedconsole.log的返回值。如果查看undefined的左侧,则会看到灰色的<-箭头,指示这是最后一条语句的返回值,而不是由代码引起的输出。

见下文:



这是REPL环境的典型行为。

09-30 10:57