当使用三元语句时,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/
JavaScript有return
后分号插入。你应该在它之后放置一个表达式,以便它可以继续。 “回归”后What are the rules for JavaScript's automatic semicolon insertion (ASI)?
谢谢丹尼尔。我完全不了解JS的ASI规则。我想通过压缩我豪华的换行编码风格,缩小版已经悄悄地缓解了这个问题。 –
@BobbyKotzev我会建议linting之前缩小。 –
在第一种情况下没有什么可在同一行评价:
您可以在这里的规则读了。在这种情况下,函数返回“undefined”。这是这种语言的工作原理。
试试这个:
function test1(a,b)
{
return a && a == 1 && b && b.match(/abc/i) ?
a + 1 :
0;
}
我已经证实了在Chrome和边缘的浏览器这种行为,以及在节点JS –
为什么你会想到不同的行为?它由Javascript语言指定。 – Barmar