当使用三元语句时,Javascript函数返回undefined

问题描述:

给定两个实现相同确切逻辑的JS函数,第一个(test1)将始终返回undefined,而第二个(test2)将返回期望值。实现的区别是一个单一的return语句,vs将评估值存储在局部变量中,然后返回它。当使用三元语句时,Javascript函数返回undefined

为什么test1返回undefined而不是预期的结果?其次,为什么把它存储在一个局部变量(test2)中使它起作用?

这里是确切的例子:

function test1(a,b) 
{ 
    return 
    a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
} 

function test2(a,b) 
{ 
    var val = 
    a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
    return val; 
} 


alert(test1(1,'abc')); // returns undefined when it should return 2 
alert(test2(1,'abc')); // returns 2 as expected 

这里是一个的jsfiddle它:https://jsfiddle.net/8gmn004t/1/

+0

我已经证实了在Chrome和边缘的浏览器这种行为,以及在节点JS –

+1

为什么你会想到不同的行为?它由Javascript语言指定。 – Barmar

JavaScript有return后分号插入。你应该在它之后放置一个表达式,以便它可以继续。 “回归”后What are the rules for JavaScript's automatic semicolon insertion (ASI)?

+0

谢谢丹尼尔。我完全不了解JS的ASI规则。我想通过压缩我豪华的换行编码风格,缩小版已经悄悄地缓解了这个问题。 –

+0

@BobbyKotzev我会建议linting之前缩小。 –

在第一种情况下没有什么可在同一行评价:

您可以在这里的规则读了。在这种情况下,函数返回“undefined”。这是这种语言的工作原理。

试试这个:

function test1(a,b) 
{ 
    return a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
}