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