【问题标题】:Javascript function returns undefined when using ternary statement [duplicate]使用三元语句时,Javascript函数返回未定义[重复]
【发布时间】:2016-06-01 18:19:33
【问题描述】:

给定两个实现相同逻辑的 JS 函数,第一个 (test1) 将始终返回 undefined,而第二个 (test2) 将返回预期值。实现的区别在于单个返回语句,而不是将评估值存储在局部变量中然后返回。

为什么 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/

【问题讨论】:

  • 我已经在 Chrome 和 Edge 浏览器以及 Node JS 中确认了这种行为
  • 为什么会有不同的行为?它由Javascript语言指定。

标签: javascript


【解决方案1】:

JavaScript 在return 之后插入了分号。你应该在它后面加上一个表达式,以便它可以继续。

您可以在此处阅读规则:What are the rules for JavaScript's automatic semicolon insertion (ASI)?

【讨论】:

  • 谢谢丹尼尔。我完全不知道 JS 的 ASI 规则。我想 minifies 通过压缩我奢华的换行编码风格已经悄悄地为我缓解了这个问题。
  • @BobbyKotzev 我建议在缩小之前进行 linting。
【解决方案2】:

在“返回”之后的第一种情况下,在同一行上没有要评估的内容。在这种情况下,函数返回“未定义”。这就是这种语言的工作方式。

试试这个:

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

【讨论】:

    猜你喜欢
    • 2013-06-26
    • 2014-03-05
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    相关资源
    最近更新 更多