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式)或语句结束符。