JavaScript BlockStatement混乱

cal*_*rae 5 javascript

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Run Code Online (Sandbox Code Playgroud)

为什么会这样?BlockStatements返回0,为什么?

T.J*_*der 12

BlockStatements返回0 ......?

不,返回其中最后一个表达式的值.你可以通过以下方式看到这一点:

{1 + 8}
Run Code Online (Sandbox Code Playgroud)

...将在JavaScript控制台中显示9.

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
为什么会这样?

因为虽然块确实返回一个值,但不使用该值.{1 + ''} + 10 // 10代码被评估为两个不同的项目:

{1 + ''} // "1"
+10      // 10
Run Code Online (Sandbox Code Playgroud)

...或者用标准缩进和分号书写:

{
    1 + '';
}
+10;
Run Code Online (Sandbox Code Playgroud)

......你看到了第二个结果,好像第一个根本就没有.在+没有加法运算符,它是一元 +(类似于一元-,但它不会改变其操作数的符号).+10当然是10; 和+''0因为施加操作者的字符串的字符串转换为一个数字,并且Number('')0.

您可以+通过尝试以下方式证明您正在看到一元而不是加法运算符:

{1 + ''} * 10
Run Code Online (Sandbox Code Playgroud)

......真的

{
    1 + '';
}
*10;
Run Code Online (Sandbox Code Playgroud)

它因语法错误而失败,因为没有一元*.

正如Felix在下面的注释中指出的那样,对于+你的例子中的加法运算符(在你的情况下最终会连接字符串),它必须在两个表达式之间,而一个块是一个语句,不是表达.

  • 这不是100%正确:http://es5.github.com/#x12.1*"返回评估StatementList的结果."*.虽然因为一个块是一个语句而因此无法在表达式中使用(至少我是如何理解它),所以它没有什么区别. (2认同)
  • 例如,在[加法运算符](http://es5.github.com/#x11.6.1)中查看,生成规则是*AdditiveExpression:AdditiveExpression + MultiplicativeExpression*,并且块既不是*AdditiveExpression*也不是*MultiplicativeExpression*.我不知道是否有一条规则说明语句不能用作表达式([`for`语句定义](http://es5.github.com/#x12.6.3)有明确的规则[变量声明](http://es5.github.com/#x12.2),例如),但它至少解释了为什么解析器在这种情况下将`+`视为一元加号. (2认同)