当我尝试将 return 与三元运算符一起使用但不与 if 语句一起使用时出现 UnexpectedToken 错误?

UnexpectedToken error when I try to use return with ternary operator but not with if statement?

所以我注意到了一些非常奇怪的事情。当我尝试在 if 语句中使用 return 关键字退出函数时它运行良好但是当我尝试使用三元运算符执行此操作时它抛出 UnexpectedToken 错误(预期表达式,得到关键字 'return').为什么会这样?

我的代码:

function monthName(nr) {
    0 < nr < 13 ? alert("Month: " + months[nr]) : return false;
  }

monthName(mnr);

但是使用 if 语句:

function monthName(nr) {
  if (0 < nr < 13)
    alert("Month: " + months[nr]);
  else
    return false;
  }

monthName(mnr);

它工作正常。那么,为什么我不能将 return 关键字与三元运算符一起使用,但在 if 语句中它可以工作?

您只能在三元组中包含表达式。如果您查看 MDN docs,您会注意到在条件之后只有字符串、布尔值等。仅最接近的解决方案 returns 或仅提醒:

function monthName(nr) {
  return 0 < nr < 13 ? "Month: " + months[nr] : false;
}

function monthName(nr) {
  alert(0 < nr < 13 ? "Month: " + months[nr] : false);
}

Why does this happen?

因为 return 是一个 语句 ,并且您不能将语句放在只允许使用表达式的地方。¹ 条件运算符的操作数必须是表达式,而不是语句。 (你会遇到与 throw 相同的问题,只是 FWIW,尽管有人谈论添加 throw 运算符......或者 whilefor 或任何其他声明.)

if 可能是您最好的选择。

如果 你真的非常想只使用一个表达式,你可以把 return 放在开头,这样后面就是单个表达式:

function monthName(nr) {
    return 0 < nr < 13 ? alert("Month: " + months[nr]) : false;
}

请注意,这依赖于 alert returns undefined 以维持您在 [=16= 中提供的两个 return 值这一事实] 示例(undefined 如果显示 alert,如果没有显示 false)。有趣的是,the spec 没有明确说明 alert returns undefined 但我认为我们可以安全地接受它是隐式指定的(尤其是因为隐式 [=51=任何非箭头 JavaScript 函数的 ] 是 undefined 除非使用 return <value>)。


¹ (你可以做相反的事情;JavaScript有“表达式语句”的概念,这意味着任何表达式也是有效的声明。)

在三进制中,return 不能是操作数。因此,当解释器读取三元表达式中的 : 运算符时,它希望后面有一个有效值,但却看到保留的关键字 return 导致程序抛出错误。

首先,这不像数学,你做不到

0 < nr < 13

因为这将尝试进行第一个比较 0 < nr,然后将其结果与 13

进行比较

所以基本上,如果 nr 为正,则它永远为真

0 < nr // true

因此

true < 13 // true

您可以在以下代码中查看:

console.log(0 < 5 < 13, " -> should be true! good")
console.log(0 < 5000 < 13, " -> should be false! but it is true")

因此,为了正确执行操作,您需要使用 AND

连接表达式
(0 < nr) && (nr < 13)

现在,对于你问的事情,基本上正如其他回复所说,你正在尝试使用 statement,而你只能使用 expressions,如果你阅读 documentation, 它说你需要提供一个 expression to execute.

因此,要解决您的问题,您可以 return 整个三元表达式。

function monthName(nr) {
  return (0 < nr) && (nr < 13) ? alert("Month: " + nr) : false;
}

monthName(5);

或者如果你想要 shorthand:

const monthName = nr => (0 < nr) && (nr < 13) ? alert("Month: " + nr) : false;

monthName(5);