2011-10-16 59 views
4

我一直在寫JavaScript和關閉13年,但在過去的幾個月裏我重新發現了它,作爲編寫程序的一種方式,任何訪問網頁的人都可以使用,而無需安裝任何東西。例如,請參閱http://ab1jx.webs.com/calcs/calcs.html防止拼接

我最近發現的show stopper是因爲JavaScript是由設計鬆散地鍵入的,所以當我希望它添加數字時它會連接字符串。而且這是不可預測的。一個例行公事的工作好幾天,然後當我把不同的數據輸入到問題時,我最終得到了一個不可思議的大數字。

有時候我有幸運的是把()放在一個學期左右,有時我不得不求助於parseInt()parseFloat()一個學期。它讓我想起了通過在一個(常數)項上加上.00來強制C中的浮點數結果。我剛剛嘗試+=這件事發生時,我已經通過對parseFloat()進行加載。

這是否只發生在另外?如果我每次使用parseInt()parseFloat()至少有一個術語添加時,是否會阻止它?我在Linux下使用Firefox 6編寫,但跨瀏覽器的可移植性也是一個問題。

回答

7

我通常這樣做:

var x = 2; 
var t = "12"; 
var q = t+x; // q == "122" 
var w = t*1+x; // *1 forces conversion to number w == 14 

如果t不是一個號碼,然後你會得到NaN

如果你乘以1個變量,你不知道它們是什麼類型。他們將被轉換爲數字。我發現這個方法比int和float轉換更好,因爲* 1適用於每種數字。

你遇到的問題是,從DOM獲取值的函數通常返回字符串。即使它是一個數字,當您獲取它時,它也會被表示爲一個字符串。

+2

使用'(t * 1 || 0)'進行多次加法,其中't'的無效值應該被忽略:'NaN || 0' = 0和'14 || 0' = 14. –

1

放心,它是非常可預測的,你只需要熟悉輸入的操作符和數據類型。

簡而言之,評估是從左到右的,每當出現字符串時都會發生串接,而不管操作的哪一側。

因此,例如:

9 + 9 // 18 
9 + '9' // '99' 
'9' + 9 // '99' 
+ '9' + 9 // 18 - unary plus 
- '9' + 9 // 0 - unary minus 

一些三元表達式:

9 + '9' + 9 // '999' 
9 + 9 + '9' // '189' 
+0

謝謝,我會記住左 - 右的事情。我主要是遇到變量問題,而不是常量,但它聽起來像(1 * A)+ B也可能工作。我喜歡逆向工程的便利。稍後保存頁面。 Alan – ab1jx

+0

@ ab1jx,變量和常量之間差別不大。他們以相同的方式進行評估,所有相同的規則都適用。提到的技巧工作,但我覺得他們在實際代碼中是不必要的。爲了維護和清晰起見,應該有一個與計算部分分開的驗證部分(參見'1 * A + B'看起來很奇怪)。我會將所有值轉換爲正確的類型,然後才能使用它們。無論如何,祝你好運! – davin

7

The specification says about the addition operator

如果Type(lprim)是字符串或類型(rprim)是字符串,然後
返回字符串即串聯接着的ToString(rprim)的ToString(lprim)的結果

這意味着如果至少一個操作者是一個字符串,字符串連接將發生。

如果我使用parseInt()parseFloat()至少有一個術語每次添加,這是否會阻止它?

不,所有的操作數必須是數字。

您可以輕鬆地將任何數字的字符串轉換成使用unary plus operator(如果你已經有一些關於它不會改變的值)爲:

var c = +a + +b; 
3

您可以使用+運營商轉換字符串到數字。

var x = '111' 
+x === 111