2016-10-20 50 views
28

我從未見過一件有趣的事情發佈在另一個問題上。他們有這樣的事情: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 –

回答

32

把你的陳述通過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

1

+運算符轉換爲數字,兩個+運算符之間的空格不做任何附加操作。

5

對我來說這是很清楚的;

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

如果你++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

9

這是在規範中。

通過挖掘,我們可以從§14.6.2.2看到增量和減量運算符在一元運算符之前(並且應該是優選的)被列出。所以優先權不會解釋這一點。

查找the punctuation table in §11.7,我們可以看到規格中的每個++(運算符)實例都顯示了兩個沒有空白的情況。這不是決定性的,直到你檢查...

The whitespace rules in §11.2,具體是:一個串文字,一個RegularExpressionLiteral,模板,或TemplateSubstitutionTail,他們被認爲是顯著碼點內,可能會出現

白色空間的代碼點構成一個文字值的一部分。它們也可能發生在評論中,但不能出現在任何其他類型的標記中。

JS不允許任意的空格中間運算符。

PegJSEsprima的JS語法證實了這一點,匹配字面上的兩個字符的字符串++

0

即使它看起來非常相似,但對於AST解釋器而言,+ +++並不完全相同。這同樣適用於令牌分離:varfoovar foo不一樣。

在表達式+ + +i中,每個x被認爲是不同的一元運算符,它將您的變量簡單地轉換爲數字。對於增量操作,即++,不允許在+和變量標記之間使用空格。在下面的例子中,最後一行是無效的:

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

相關問題