[英]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
运算符......或者使用while
或for
或任何其他语句。)
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)
现在,对于您提出的问题,基本上正如其他回复所说,您正在尝试使用只能使用expressions
的statement
,如果您阅读文档,它说您需要提供一个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.