【发布时间】:2012-03-21 11:21:03
【问题描述】:
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
为什么会这样? BlockStatements 是否返回 0,为什么?
【问题讨论】:
标签: javascript
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
为什么会这样? BlockStatements 是否返回 0,为什么?
【问题讨论】:
标签: javascript
BlockStatements 是否返回 0...?
不,blocks 返回其中最后一个表达式的值。您只需执行以下操作即可看到:
{1 + 8}
...在 JavaScript 控制台中,将显示 9。
{1 + ''} + 10 // 10{1 + ''} + '' // 0
为什么会这样?
因为虽然该块确实返回了一个值,但该值并未被使用。 {1 + ''} + 10 // 10 代码被评估为两个不同的项目:
{1 + ''} // "1"
+10 // 10
...或者用标准缩进和分号写:
{
1 + '';
}
+10;
...您会看到第二个的结果,就好像第一个根本不存在一样。 + 没有加法运算符,它是unary +(类似于unary -,但它不会改变其操作数的符号)。 +10 当然是 10;而+'' 是0,因为将运算符应用于字符串会将字符串转换为数字,而Number('') 是0。
您可以通过尝试以下方法来证明您看到的是一元 + 而不是加法运算符:
{1 + ''} * 10
...真是的
{
1 + '';
}
*10;
由于没有一元 *,因此失败并出现语法错误。
正如 Felix 在下面的 cmets 中指出的那样,对于您示例中的 + 是加法运算符 (在您的情况下,它最终会连接字符串),它会是between two expressions,块是statement,而不是expression。
【讨论】:
{''}+'a' 返回NaN,但现在我意识到这是因为 +。
for statement definition 有一个明确的规则用于 variable statement),但它至少解释了为什么解析器会处理 @987654355 @ 在这种情况下为一元加号。