Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript块语句混淆_Javascript - Fatal编程技术网

JavaScript块语句混淆

JavaScript块语句混淆,javascript,Javascript,为什么会发生这种情况?BlockStatements是否返回0,为什么 BlockStatements是否返回0 否,返回其中最后一个表达式的值。您只需执行以下操作即可看到这一点: {1 + ''} + 10 // 10 {1 + ''} + '' // 0 …在JavaScript控制台中,将显示9 {1+'}+10//10 {1+'}+'//0 为什么会发生这种情况 因为尽管块返回值,但不使用该值{1+'}+10//10代码被评估为两个不同的项目: {1 + 8} …或使用标准缩进和分号

为什么会发生这种情况?BlockStatements是否返回0,为什么

BlockStatements是否返回0

否,返回其中最后一个表达式的值。您只需执行以下操作即可看到这一点:

{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;