2014-03-04 64 views
9

這純粹是一個教育問題。Javascript:什麼是「 - 0」在幹什麼?

我正在研究一個我正在爲之工作的公司的新版本的Web應用程序。當重寫數學時,我碰到了這個:

document.getElementById("estResidual").value-0; 

認爲沒有目的的「-0」,我刪除它。但是當我嘗試計算時,數字是waaayyyyyyy關閉。然後我嘗試重新添加「-0」,瞧!一切都很好。

問題: 「-0」做了什麼改變值?

+1

注 - 當您使用'+ 0'時,它可能仍然看起來像一個串聯。與減號不混淆。 – Floris

+1

@弗洛伊斯 - 只是重新讀你的評論,並意識到這一點...所以我刪除了我的。 :) – Steve

回答

19

這是(ab)使用JavaScript的軟打字行爲。在這種情況下,將一個字符串轉換爲float:

> "13" 
"13" 
> "13"-0 
13 
> "1.01"-0 
1.01 

一元+會做同樣的:

> +"13" 
13 
> +"9.9" 
9.9 

注意,使用+反而會轉換成整數0成字符串並連接它:

> "13"+0 
"130" 

這是全部標準化的。有關這些操作員應該如何操作的明確細節,可以隨時檢查ECMAScript語言規範(例如,addition,subtraction,unary plus)。

+0

優秀的知識。 –

+0

爲什麼「濫用」?當然,學習使用不同語言的方法是有益的,不是嗎?或者這是一種最好的避免的做法,因爲編碼草率很容易出現問題? – DanTheMan

+6

@DanTheGameMan:我個人不喜歡它,因爲它根本不明顯。畢竟,你不得不在stackoverflow上詢問它做了什麼=)。然後看到'-0'的作用,你可能會認爲'+ 0'的算法具有相同的工作方式,但這給了你一個完全不同的結果!我建議使用'parseInt()'或'parseFloat()' – Claudiu

1

JS引擎會立即重新嘗試並使語句正常工作。所以JS會施放「23」整數23當您嘗試在其上執行數學運算,同樣會整數23轉換爲字符串「23」,如果你這樣做:

var a = 23; 
console.log(23 + "asdf"); 
//outputs "23asdf" 
+1

這不是一個真正的靜態打字問題。靜態類型的語言可以具有這種確切的行爲,其中表達式「-」的類型將是「」。 – Claudiu

+0

@Claudiu好點。編輯。 – BLSully

1

這迫使類型對象成爲一個數字而不是一個字符串。

+0

好,克勞迪烏的答案比我的好得多 – Charles380

+0

你仍然會爲此付出努力:) – DanTheMan