JavaScript将“+ + i”解释为什么?

问题描述:

我从未见过一件有趣的事情发布在另一个问题上。他们有这样的事情:JavaScript将“+ + i”解释为什么?

var i = + +1; 

他们认为多余的+它转换为字符串,但他们只是增加了一个字符串,是什么原因造成的转换。

但是,这引出了一个问题:这里发生了什么?

我实际上预计会出现编译器错误,但JavaScript(至少在Chrome中)对它来说很好......它基本上什么都不做。

我创建了一个小的jsfiddle证明:Demo

var i = 5; 
 
var j = + +i; 
 
document.body.innerHTML = i === j ? 'Same' : 'Different';

任何人都知道什么是实际发生的,什么JavaScript是在这个过程中做什么?

我想,也许它会像对待++i,但i不增加,你甚至可以用一个值(例如,+ +5),你不能做呢++(例如,++5是参考错误)。

间距也不会影响它(例如,+ + 1+ +1是相同的)。

我最好的猜测是它把它们当作正面/负面的标志并把它们放在一起。它看起来像1 == - -1-1 == + -1,但这很奇怪。

这仅仅是一个古怪的行为,还是它被记录在标准的某个地方?

+1

在我看来像'+'经营者把左操作数为可选。如果没有左操作数,它只返回右操作数。 – Amy

+5

带有空格的'+'或'-'运算符只是简单的'+/-'运算符。你可以做'+ + + 3',它会给你'3'。没有什么奇怪的 – galchen

+0

http://pythontutor.com/javascript.html#mode=edit –

把你的陈述通过AST Explorer,我们可以看到我们在这里得到的是两个嵌套的一元表达式,带一元+运算符。

它包括++i一元表达式,+i是本身包括+i一个一元表达。

带一元+运算符的一元表达式将将表达式部分转换为数字。所以你基本上将i转换为一个数字,然后再将其结果转换为一个数字(这是一个无操作)。

完成的缘故,它适用于尽可能多的水平添加:

var i = 5; 
console.log(+ + + + + +i); // 5 
console.log(i); // still 5 
+0

显然,您可以无限期地链接这些:'+ + + + + + + + + + 1'是有效的JavaScript。 – tadman

+0

事实上,你可以,你抓到我中期编辑:) –

+8

所以这是JavaScript的“水牛水牛水牛”。 – Amy

+运算符转换为数字,两个+运算符之间的空格不做任何附加操作。

对我来说这是很清楚的;

var a = +3; 
var b = +a; // same as a, could be -a, for instance 
var c = + +a; // same as above, same as +(+a) 

如果你++variable JavaScript解释器把它看成increment operator

如果你这样做了+ +variable javascript解释器将它视为Unary plus,强制将值强制为一个数字两次。

所以

var a = 1; 
var b = +a; 
var c = +b; 

console.log(c);// still 1 

相同

var c = + +1; 

所以,简单的答案是两个加号不能用空格隔开被解释为增量,空间使得它如此口译员看到两个单独的空间,这就是它真正的

+1

也相当于更明确的'+(+ 1)' – tadman

这是在规范中。

通过挖掘,我们可以从§14.6.2.2看到增量和减量运算符在一元运算符之前(并且应该是优选的)被列出。所以优先权不会解释这一点。

查找the punctuation table in §11.7,我们可以看到规格中的每个++(运算符)实例都显示了两个没有空白的情况。这不是决定性的,直到你检查...

The whitespace rules in §11.2,具体是:一个串文字,一个RegularExpressionLiteral,模板,或TemplateSubstitutionTail,他们被认为是显著码点内,可能会出现

白色空间的代码点构成一个文字值的一部分。它们也可能发生在评论中,但不能出现在任何其他类型的标记中。

JS不允许任意的空格中间运算符。

PegJSEsprima的JS语法证实了这一点,匹配字面上的两个字符的字符串++

即使它看起来非常相似,但对于AST解释器而言,+ +++并不完全相同。这同样适用于令牌分离:varfoovar foo不一样。

在表达式+ + +i中,每个x被认为是不同的一元运算符,它将您的变量简单地转换为数字。对于增量操作,即++,不允许在+和变量标记之间使用空格。在下面的例子中,最后一行是无效的:

var x = "4"; 
 
console.log(+ + +x); 
 
console.log(+ + ++x); 
 
console.log(+ ++ +x);