JS中的表达式和语句有什么区别?

时间:2016-10-03 16:19:11

标签: javascript node.js expression

语句和表达式有什么区别?我怎么知道每个人都是?

为什么无效转换这个:

void function() {

}();

进入表达式?

为什么会这样:

something((something) => something + 2);

而这不是:

something((something) => if (something) { something + 2 });

谢谢!

1 个答案:

答案 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需要操作数(表达式)或语句终结符。