繁体   English   中英

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

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

所以我注意到一些非常奇怪的事情。 当我尝试在 if 语句中使用return关键字退出 function 时,它运行良好,但是当我尝试使用三元运算符执行此操作时,它会引发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 语句一起使用呢?

为什么会这样?

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

if可能是你最好的选择。

如果你真的很想只使用一个表达式,你可以将return放在开头,这样单个表达式就是它后面的内容:

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

请注意,这依赖于alert返回undefined的事实,以便维护您在if示例中提供的两个返回值(如果显示alert ,则为undefined ,否则为false )。 有趣的是,规范没有明确说明alert返回undefined ,但我认为我们可以安全地接受它是隐式指定的(尤其是因为任何非箭头 JavaScript function 的隐式返回是undefined的,除非使用return <value> )。


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

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

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

或者

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

在三元中, 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)

现在,对于您提出的问题,基本上正如其他回复所说,您正在尝试使用只能使用expressionsstatement ,如果您阅读文档,它说您需要提供一个expression to execute

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

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

或者如果你想要一个速记:

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

monthName(5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM