JavaScript块语句混淆
为什么会发生这种情况?BlockStatements是否返回0,为什么 BlockStatements是否返回0 否,返回其中最后一个表达式的值。您只需执行以下操作即可看到这一点:JavaScript块语句混淆,javascript,Javascript,为什么会发生这种情况?BlockStatements是否返回0,为什么 BlockStatements是否返回0 否,返回其中最后一个表达式的值。您只需执行以下操作即可看到这一点: {1 + ''} + 10 // 10 {1 + ''} + '' // 0 …在JavaScript控制台中,将显示9 {1+'}+10//10 {1+'}+'//0 为什么会发生这种情况 因为尽管块返回值,但不使用该值{1+'}+10//10代码被评估为两个不同的项目: {1 + 8} …或使用标准缩进和分号
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
…在JavaScript控制台中,将显示9
{1+'}+10//10
{1+'}+'//0
为什么会发生这种情况 因为尽管块返回值,但不使用该值<代码>{1+'}+10//10代码被评估为两个不同的项目:
{1 + 8}
…或使用标准缩进和分号书写:
{1 + ''} // "1"
+10 // 10
…你看到了第二个的结果,就好像第一个根本不存在一样。+
没有加法运算符,它是(类似于,但不改变其操作数的符号)<代码>+10当然是10
;而+'
是0
,因为对字符串应用运算符会将字符串转换为数字,number('')
是0
通过尝试以下操作,可以证明看到的是一元+
,而不是加法运算符:
{
1 + '';
}
+10;
…这真是
{1 + ''} * 10
由于没有一元*
,因此失败并出现语法错误
正如Felix在下面的评论中所指出的,对于示例中的
+
作为加法运算符(在您的例子中,它最终会连接字符串),它必须是,并且块是a,而不是a。谢谢!起初我很困惑,因为{'}+'a'
返回NaN
,但现在我意识到这是因为+。这不是100%正确:“返回评估语句列表的结果。”。虽然块是一个语句,因此不能在表达式中使用(至少我是这样理解的)。@FelixKling:谢谢!我删除了不正确的位(“块不返回任何内容”)。现在我必须深入研究语法(我现在没有时间去做),以理解块和它后面的表达式保持独立的根本原因。它们是的,我知道它们是的,但我不知道语法的哪一部分规定了…:-)正如您所说,这可能与语句与表达式有关。例如,在,产生式规则是AdditiveExpression:AdditiveExpression+乘法Expression,而块既不是AdditiveExpression,也不是乘法Expression。我不知道是否有一条规则规定语句不能用作表达式(例如,有一条显式规则用于),但它至少解释了为什么解析器在这种情况下将+
视为一元加号。@FelixKling:干杯,为我节省了时间。我在答案中编辑了一些信息。
{
1 + '';
}
*10;