语句和表达式有什么区别?我怎么知道每一个是什么?
为什么 void 转换这个:
void function() {
}();
变成一个表达式?
为什么会这样:
something((something) => something + 2);
这不是:
something((something) => if (something) { something + 2 });
?
谢谢!!
最佳答案
语句和表达式是不同的语言单位。可能让您感到困惑的是,与其他一些语言不同,JavaScript 具有规范所称的 ExpressionStatement。 :它可以将任何表达式视为语句(但不能将语句视为表达式)。例如,这是有效的 JavaScript:
flag && console.log("Hi there");
...而在(比方说)Java 中这将是无效的,因为虽然 Java 有一些特定的语句来允许特定的类似表达式的东西(例如方法调用),但它没有 JavaScript 的整体 < em>表达式语句。
Why
void
transform this:void function() { }();
into an expression?
因为 void
is an operator .它评估其操作数(无论其后是什么),然后将其结果设置为 undefined
。它与您在 C、C++、Java 或 C# 等语言中看到的 void
完全无关。所以整个事情是一个ExpressionStatement。您需要 void
的唯一原因是,如果没有它,当解析器期望看到一个语句时,关键字 function
会将解析器置于它期待一个语句的状态函数声明,而不是表达式。 (您可以使用任何运算符,而不仅仅是void
,将解析器置于表达式状态;details in this question and its answers。)
And why this works:
something((something) => something + 2);
and this don't:
something((something) => if (something) { something + 2 });
因为箭头函数的方式是由规范定义的。箭头函数有两种形式:
- 主体简洁(无
{}
) - body 冗长的人
简明示例:
array.sort((a, b) => a - b);
等效的详细示例:
array.sort((a, b) => {
return a - b;
});
具有简洁主体的箭头函数要求主体是一个表达式,因为正如您在上面看到的那样,它们返回表达式的结果。您不能在那里使用语句的原因与您不能在其他需要表达式的地方使用语句的原因相同:隐式 return
语句需要结果值。你的第二个例子,翻译成一个冗长的正文,是这样的:
something((something) => {
return if (something) { something + 2 };
});
...这说明了为什么它不起作用:您在 return
之后有一个 if
,但是 return
statement需要一个操作数(表达式)或语句终止符。
关于javascript - JS中的表达式和语句有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836073/