【问题标题】:javascript if giving "undefined" in console [duplicate]javascript如果在控制台中给出“未定义”[重复]
【发布时间】:2014-01-19 01:05:25
【问题描述】:

我确定我只是在俯瞰某些东西,但我看不到它是什么。

我有一个页面用于通过控制台测试一些新代码。大多数都有效。

    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 语句后,它确实会在所有这些语句之后继续运行代码。

【问题讨论】:

  • 该代码在函数中吗?如果是这样,如果没有返回,它将输出'undefined'
  • 控制台总是 打印最后评估的语句的值。块语句没有价值(它们是 undefined),var 声明、function 声明和其他声明也是如此。

标签: javascript if-statement


【解决方案1】:

我进入控制台:if (thisNode.L1.download.sku.toString() == lastSku) {} i get "undefined"

这完全是意料之中的行为。

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

在控制台上试试这个:

console.log('foo')

你会看到

foo
undefined

foo是console.log输出的,undefined是console.log的返回值。如果你看undefined的左边,你会看到一个灰色的<-箭头,表示这是最后一条语句的返回值,不是代码造成的输出。

见下文:

这是REPL 环境的典型行为。

【讨论】:

  • 实际上,我确实看到了未定义的。我非常专注于那个显示,我没有看到 else if 将永远不会被检查,因为,DUH,第一个返回了一些东西。我需要用一些&& 组合这些对来重组它。我不完全确定我一开始不这样做是在想什么。
  • @ManofSnow 是的,他会的,除非您使用的浏览器在其中 console.log 返回值或在 REPL 模式下不输出返回值的控制台。
  • @meagar 好的,但我看到您的编辑将 for 替换为 foo
  • @ManofSnow 7 分钟前已更正...你能解释一下为什么你认为他“不会从中看到 undefined”吗?
  • @meager 我不知道 return 关键字会出现在没有函数的 if 语句中
【解决方案2】:

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
}

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多