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
,但这很奇怪。
这仅仅是一个古怪的行为,还是它被记录在标准的某个地方?
把你的陈述通过AST Explorer,我们可以看到我们在这里得到的是两个嵌套的一元表达式,带一元+运算符。
它包括+
和+i
一元表达式,+i
是本身包括+
和i
一个一元表达。
带一元+运算符的一元表达式将将表达式部分转换为数字。所以你基本上将i
转换为一个数字,然后再将其结果转换为一个数字(这是一个无操作)。
完成的缘故,它适用于尽可能多的水平添加:
var i = 5;
console.log(+ + + + + +i); // 5
console.log(i); // still 5
+运算符转换为数字,两个+运算符之间的空格不做任何附加操作。
对我来说这是很清楚的;
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)' – tadman
这是在规范中。
通过挖掘,我们可以从§14.6.2.2看到增量和减量运算符在一元运算符之前(并且应该是优选的)被列出。所以优先权不会解释这一点。
查找the punctuation table in §11.7,我们可以看到规格中的每个++
(运算符)实例都显示了两个没有空白的情况。这不是决定性的,直到你检查...
The whitespace rules in §11.2,具体是:一个串文字,一个RegularExpressionLiteral,模板,或TemplateSubstitutionTail,他们被认为是显著码点内,可能会出现
白色空间的代码点构成一个文字值的一部分。它们也可能发生在评论中,但不能出现在任何其他类型的标记中。
JS不允许任意的空格中间运算符。
即使它看起来非常相似,但对于AST解释器而言,+ +
和++
并不完全相同。这同样适用于令牌分离:varfoo
与var foo
不一样。
在表达式+ + +i
中,每个x
被认为是不同的一元运算符,它将您的变量简单地转换为数字。对于增量操作,即++
,不允许在+和变量标记之间使用空格。在下面的例子中,最后一行是无效的:
var x = "4";
console.log(+ + +x);
console.log(+ + ++x);
console.log(+ ++ +x);
在我看来像'+'经营者把左操作数为可选。如果没有左操作数,它只返回右操作数。 – Amy
带有空格的'+'或'-'运算符只是简单的'+/-'运算符。你可以做'+ + + 3',它会给你'3'。没有什么奇怪的 – galchen
http://pythontutor.com/javascript.html#mode=edit –