2014-02-07 195 views
0

我在某處看到下面的代碼。Javascript - 運營商

var num = "1" - - "1"; 
console.log(num); 

輸出是2.有人解釋我在這裏發生了什麼。

在此先感謝。

+0

減法負數實際上是加上它...... 1 - (-1)= 1 + 1 = 2 – opalenzuela

回答

4

當使用數學運算(除了用於字符串連接的+)字符串,字符串將嘗試轉換爲數字。

一減(減一)是兩。

"1" - - "1"是相同1 - -11 + 1

+0

+1對於」當使用字符串的數學運算時,字符串將嘗試轉換爲數字。說真的,我不知道。 –

+0

但是,當一個或多個字符串是操作數時,JavaScript會將'+'運算符解釋爲串聯,而不是數學運算,所以並不是所有情況。 – Kyle

+0

@凱爾是的,沒錯。 – xdazz

0

取1和帶走-1,這是與加入1.

換句話說

1 - (-1) 
= 1 + 1 
= 2 
1

這兩者爲數字轉換,並且將它們相加。在javascript中,- "1"實際上只是-1,所以"1" - - "1"1 + 1,因爲它將兩者都轉換爲數字。請注意,如果你這樣做"1" + "1"的JavaScript將其視爲級聯,並會給予"11"

在Javascript中:

"1" + 1 = "1" + "1" = 1 + "1" = "11" 
-1 + "1" = "-11" 
1 + "-1" = "1-1" 

這就是爲什麼數學在JavaScript如此不可思議,但減法轉換爲數字(因爲減去字符串沒有按」沒有意義。)

1

減去一個負數與添加該數的絕對值是一樣的。這是數學的一個共同特性,而不是javascript。正如所寫,代碼當然是愚蠢的。這可能是程序員不熟悉parseInt的結果,它試圖避免加號被解釋爲字符串連接的問題。

1 - - 1 == 1 + 1 // true 
"1"- -"1" == "1" + "1" // false 
1
"1" - - "1" //as "-" is an arithmetic operator 
(numeric equivalent of "1"-> parseInt("1", 10)) - - (numeric equivalent of "1") 
= 1 - - 1 
= 1 - (-1) 
= 2 
1

這是JavaScript的類型強制方法的結果。

在涉及數字和字符串值與+ 操作表達式,JavaScript的數值轉換爲字符串。

在涉及其他運算符的語句中,JavaScript不會將數值轉換爲字符串。

此引用是針對相反的情況(將數值轉換爲字符串,但可能適用相同的規則)。

給出的另一個例子是(+"1.1") + (+"1.1") = 2.2。在這種情況下,括號會導致JavaScript將+運算符綁定爲字符串作爲一元運算符+,從而將字符串轉換爲數字類型。

更多詳情https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals

由於您的例子包括「其他運營商」,JavaScript的出現在-運營商綁定爲一元陰性,做計算(其中有效果之前強制轉換字符串爲數字類型添加字符串中表示的數字值)。

+0

你還應該提到相反的地方,字符串被轉換爲數值(這就是發生的情況)。 –

+0

的確如此,謝謝。我不確定相反的情況是否完全受引用頁面支持,但我認爲它提供了關於手頭問題的公平解釋。 – Kyle

0

這是因爲雙負爲正(short video explanationlong explanationlogical concept of double negation)與隱data type conversion「幫助」 - 在JavaScript中,我們的情況。

所以,

1 - - 1 // = 2 

1 - - - 1 // = 0, weird but it works :-) 

爲什麼?因爲當對號碼進行操作時,每個偶數的' - '符號都被評估爲'+',並且每個奇數的' - '符號都會給出' - '。鑑於這些,在上面的第一個例子「1 - 1 = 2」中我們有2個減號,所以表達式實際上是「1 + 1 = 2」,這是正確的。在第二個例子中,我們有3個減號,表達式變爲「1 - 1 = 0」,這也是正確的。

使用相同的原理,有人(一dark dark overlord也許:-),可以寫東西沿着這些路線,只是爲了混淆用途:

var a = 3 + - + - + - + - + - - - - - + + + + + - - - + + + 1 

,並會問,如果這給出了一個錯誤?使用上面相同的算法,我們可以說我們的「表達式」有12個「 - 」符號,12個是偶數=>所有這些「 - 」符號都返回「+」,所以基本上我們可以重寫上面的分配:

var a = 3 + 1 // which gives 4 

其他怪異的例子:

- - - - + + + - + + + - - - + + - + + - - 3    // returns -3 
- - - - + + + - + + + - - - + + - + + - - - - - + + 3 // returns 3 
- + - - - - new Date()         // return current negative timestamp 
- (+ - - -(function() { return 3; })())     // returns 3 
var a = - + - 1, b = - - (- - - a); a + b   // returns 0 

信息:沒有dark overlords寫此評論的:-)過程中受到傷害。 「