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

声明和expression之间有什么区别? 我怎么知道每一个是?

为什么void变换这个:

void function() { }(); 

成一个expression式?

为什么这个工作:

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

而这不:

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

谢谢!!

陈述和expression是不同的语言单位。 可能会让你感到沮丧的是,与其他语言不同,JavaScript具有ExpressionStatement的特性 :它可以将任何expression式视为一个语句(但不能将语句视为expression式)。 例如,这是有效的JavaScript:

 flag && console.log("Hi there"); 

…而在(比方说)Java是无效的,因为虽然Java有一些特定的语句来允许特定的expression式的东西(例如方法调用),但它没有JavaScript的整体ExpressionStatement

为什么void变换这个:

 void function() { }(); 

成一个expression式?

因为void是一个操作符 。 它评估它的操作数(不pipe跟在它之后),然后将其结果设置为undefined 。 它与C,C ++,Java或C#等语言中看到的void并无关系。 所以整个事情就是一个expression式语句 。 你需要void的唯一原因是没有它,当parsing器期望看到一个语句时,关键字function将parsing器置于期望函数声明的状态,而不是expression式。 (你可以使用任何操作符,而不是void ,将parsing器置于expression状态; 这个问题及其答案的细节 。)

为什么这个工作:

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

而这不:

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

由于箭头函数由规范定义的方式。 有两种forms的箭头function:

  • 一个简洁的身体(没有{}
  • 一个详细的身体

简洁的例子:

 array.sort((a, b) => a - b); 

等同冗长的例子:

 array.sort((a, b) => { return a - b; }); 

箭头函数与简洁的机构要求身体是一个expression式,因为,如上所见,他们返回expression式的结果。 你不能在那里使用语句,因为你不能使用语句的其他地方需要一个expression式:隐式return语句需要一个结果值。 你的第二个例子,翻译成一个详细的身体,是这样的:

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

…它演示了为什么它不工作:你有一个if return后,但return语句需要一个操作数(expression式)或语句结束符。