我确定我只是忽略了某些东西,但我看不出它是什么。
我有一个页面,我正在使用控制台测试一些新代码。大多数都有效。
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
语句之后,它确实在所有语句之后继续运行代码。
答案 0 :(得分:3)
我进入控制台:if(thisNode.L1.download.sku.toString()== lastSku){}我得到“未定义”
这完全是预期的行为。
您看到的undefined
(以及您在较大的代码示例中看到的最终undefined
)只是Chrome的JS控制台输出最后一个语句评估的值,并且在JavaScript中, if
语句不会计算为值。
在控制台上试试这个:
console.log('foo')
你会看到
foo
undefined
foo
由console.log
输出,undefined
是console.log
的返回值。如果您查看undefined
的左侧,您会看到一个灰色的<-
箭头,表示这是代码导致的最后一个语句 not 输出的返回值
见下文:
这是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
}