语句和表达式有什么区别?我怎么知道每个人都是?
为什么无效转换这个:
void function() {
}();
进入表达式?
为什么会这样:
something((something) => something + 2);
而这不是:
something((something) => if (something) { something + 2 });
谢谢!
答案 0 :(得分:11)
陈述和表达是不同的语言单位。可能绊倒你的是,与其他语言不同,JavaScript具有规范调用的ExpressionStatement:它可以将任何表达式视为语句(但它不能将语句视为表达式)。例如,这是有效的JavaScript:
flag && console.log("Hi there");
...而在(比方说)Java中不会有效,因为虽然Java有一些特定的语句允许特定的表达式事物(例如方法调用),但它并没有拥有JavaScript的 ExpressionStatement 。
为什么
void
会对此进行转换:void function() { }();
进入表达式?
因为void
is an operator。它计算其操作数(后面跟随它),然后将其结果设置为undefined
。它与你在C,C ++,Java或C#等语言中看到的void
完全没有关系。所以整个事情是 ExpressionStatement 。你需要void
的唯一原因是没有它,当解析器期望看到一个语句时,关键字function
会将解析器置于一个期望函数声明的状态而不是表达。 (您可以使用任何运算符,而不仅仅是void
,将解析器置于表达式状态; details in this question and its answers。)
为什么会这样:
something((something) => something + 2);
而这不是:
something((something) => if (something) { something + 2 });
由于规范定义箭头函数的方式。箭头功能有两种形式:
{}
)简明示例:
array.sort((a, b) => a - b);
等效详细示例:
array.sort((a, b) => {
return a - b;
});
具有简洁实体的箭头函数要求主体是表达式,因为正如您在上面所看到的,它们返回表达式的结果。您不能在那里使用语句,原因与您不能在其他地方使用语句的原因相同:隐式return
语句需要结果值。你的第二个例子,翻译成一个冗长的身体,是:
something((something) => {
return if (something) { something + 2 };
});
...这说明了为什么它不起作用:if
之后有return
,但return
statement需要操作数(表达式)或语句终结符。