为什么"a + + b"有效,但"a ++ b"不起作用?

Pet*_*son 38 javascript

我正在摆弄不同的东西,像这样

var a = 1, b = 2;
alert(a + - + - + - + - + - + - + - + b); //alerts -1
Run Code Online (Sandbox Code Playgroud)

我可以删除空格,它仍然可以工作.

a+-+-+-+-+-+-+-+b
Run Code Online (Sandbox Code Playgroud)

然后我试了一下

a + + b
Run Code Online (Sandbox Code Playgroud)

它运行并评估为3,但当我删除空格时,(a++b)它不会运行,并且它有一个警告,上面写着"令人困惑的加号".

在类似的情况下,我可以理解

a+++++b
Run Code Online (Sandbox Code Playgroud)

可以解释为以下任何一种

(a++) + (++b)
(a++) + +(+b)
a + +(+(++b))
a + +(+(+(+b)))
Run Code Online (Sandbox Code Playgroud)

这会令人困惑.

但在这种情况下

a++b
Run Code Online (Sandbox Code Playgroud)

据我所知,唯一有效的解释方法是

a + +b
Run Code Online (Sandbox Code Playgroud)

为什么不起作用a++b

Dig*_*ane 58

Javascript解析器是贪婪的(它每次匹配最长的有效运算符),因此它从++运算符中获取a++b,使得:

(a++) b
Run Code Online (Sandbox Code Playgroud)

这是无效的.放入空格时a + + b,解析器将其解释为:

(a) + (+b)
Run Code Online (Sandbox Code Playgroud)

哪个是有效的,可以算是三个.

有关详细信息,请参阅此维基百科关于Maximal munch的文章.

  • 我认为这是关键的答案:解析器是**贪婪**. (7认同)
  • 如果不贪心,那就没用了.'a ++'将被解释为'a + +',这是非法的.其中一个重要的见解是,在弄清楚这些令牌是什么意思之前,弄清楚输入包含哪些令牌.所以'++'将成为'++'令牌,即使该令牌在该上下文中无效. (3认同)

Nie*_*sol 12

它在阅读a++,然后遇到一个b,不知道该怎么做.


mla*_*the 7

这是一元运算符差异的b/c.

"a + + b" is the same as "a + (+b)"
"a++b"    is the same as "(a++) _ b"  <--- there is a missing operator where the _ is
Run Code Online (Sandbox Code Playgroud)