Javascript “为什么?”;a和x2B+;b";工作,但是;a和x2B+;b";不';T
我在摆弄不同的东西,像这样Javascript “为什么?”;a和x2B+;b";工作,但是;a和x2B+;b";不';T,javascript,Javascript,我在摆弄不同的东西,像这样 var a = 1, b = 2; alert(a + - + - + - + - + - + - + - + b); //alerts -1 我可以移除这些空间,它仍然可以工作 a+-+-+-+-+-+-+-+b 然后我试着 a + + b 它运行并计算为3,但当我删除空格时,(a++b)它不会运行,并且它有一个警告,上面写着“混淆加号” 我能理解在这样的情况下 a+++++b 可解释为以下任何一种情况: (a++) + (++b) (a++) + +(+b
var a = 1, b = 2;
alert(a + - + - + - + - + - + - + - + b); //alerts -1
我可以移除这些空间,它仍然可以工作
a+-+-+-+-+-+-+-+b
然后我试着
a + + b
它运行并计算为3,但当我删除空格时,(a++b
)它不会运行,并且它有一个警告,上面写着“混淆加号”
我能理解在这样的情况下
a+++++b
可解释为以下任何一种情况:
(a++) + (++b)
(a++) + +(+b)
a + +(+(++b))
a + +(+(+(+b)))
这会让人困惑
但在这种情况下
a++b
据我所知,唯一有效的解释方法是
a + +b
为什么
a++b
不起作用?它在读a++
,然后它遇到了b
,不知道该怎么处理它。这是一元运算符的不同之处
"a + + b" is the same as "a + (+b)"
"a++b" is the same as "(a++) _ b" <--- there is a missing operator where the _ is
“a++b”与“a+(+b)”相同
“a++b”与“(a++)b”Javascript解析器是贪婪的(它每次都匹配最长的有效运算符),因此它从a++b
获取++
运算符,使:
(a++) b
这是无效的。当您在空格a++b
中添加空格时,解析器将其解释为:
(a) + (+b)
这是有效的,结果是三
有关详细信息,请参阅上的这篇Wikipedia文章。Javascript的++
增量运算符的运算符前置规则没有左右关联性。这意味着a++b
可以解释为a++b
或a++b
,具体取决于具体的实现。不管怎样,这都是一个语法错误,因为有两个变量,一个一元运算符,两个变量之间没有任何连接
实际上:
a = 1
b = 2;
a++ b; -> 2 2
a ++b; -> 1 3
13
作为JS代码意味着什么 大多数编程语言解析器试图获取最长的有意义的文本块,因此当Javascript看到:
[a][][][][]
“变量a”-这很有意义,让我们看看下一个字符:
[a][+][][]
[a][+][+][]
“将添加到变量a”-这很有意义,让我们看看下一个字符:
[a][+][][]
[a][+][+][]
“will post increment variable a”-这很有意义,让我们看看下一个字符
[a][+][+][b]
这是没有道理的。我有两个表达式(a++)和(b),它们之间没有中缀运算符
如果将其设置为a++b
,它将找不到++
运算符,并且它将作为a++b
规则在此处显示。它说解析器必须考虑从左到右的最长标记(我假设Javascript的语法是从左到右的)。所以只要应用这个规则,你就会得到你的答案
解析器将从左边开始,在“a++b”的情况下,将a、+、+&和b分开标记(由于它们之间有空格)。在“a++b”的情况下,它将应用最长匹配规则,并将创建一个+++&b作为令牌。a++b作为一个表达式没有任何语义意义,因此它不会被编译。答案是++是一个运算符,也是+,并且++是两个+运算符,不是++运算符
<>虽然不是JavaScript,C++与+和++操作符有着相似的乐趣。这是从一开始就被调查过的。我猜它与a++冲突,a++是有效的synax,或++b。它也可以被解释为(a++)b或a(++b)…额外的信用:为什么a+++b
工作?(你现在应该有足够的信息来回答这个问题)我认为这是关键的答案:解析器是贪婪的。如果它不是贪婪的,它将是非常无用的“a++”将被解释为“a++”,这是非法的。其中一个重要的洞察是,在弄清楚这些令牌的含义之前,先要弄清楚输入包含哪些令牌。所以“++”将成为“++”标记,即使该标记在该上下文中无效。