2009-09-13 86 views
1

我有這樣的代碼:奇怪的JavaScript的加法問題

var totalAmt=0; 
for (i in orders) 
{ 
    order=orders[i]; 
    if (order.status !='Cancelled') 
     totalAmt=totalAmt + order.amount; 
} 

但是,如果我有3個訂單金額3,1,5,然後代替totalAmt體9,我得到0315。所以我認爲它將這些數量加在一起而不是整數。

我該如何解決這個問題?

回答

11

order.amount是一個字符串,如果+運算符的一個操作數是一個字符串,則會使用並置來代替求和。

你應該使用一元加法運算符將其轉換爲數字,例如:

var totalAmt = 0, i, order; // declaring the loop variables 
for (var i in orders) { 
    order = orders[i]; 
    if (order.status !='Cancelled') 
     totalAmt += +order.amount; // unary plus to convert to number 
} 

你可以選擇使用:

totalAmt = totalAmt + (+order.amount); 
totalAmt = totalAmt + Number(order.amount); 
totalAmt = totalAmt + parseFloat(order.amount); 
// etc... 

另外你使用的是for..in循環遍歷orders,如果orders是一個數組,則應該使用正常for循環:

for (var i = 0; i<orders.length; i++) { 
    //... 
} 

這是因爲for...in聲明旨在用於疊代對象屬性,數組可能是很有誘惑力的使用它,因爲似乎工作,但不推薦,因爲它會遍歷對象屬性,如果你已經擴展了Array.prototype,除了數字索引之外,這些屬性也會被迭代。

另一個原因,以避免它是由於反覆的被這句話所用的順序是任意,並遍歷數組可能不能訪問數字順序的元素,並且還似乎比簡單的更slower循環。

如果迭代順序並不重要,我個人很喜歡向後遍歷:

var i = orders.length; 
while (i--) { 
    //... 
} 
+0

這就是我想要的。爲什麼在它會將'order.amount'轉換爲字符串呢? – 2009-09-13 01:56:57

+0

爲什麼我應該使用'for'來循環當'for in'更容易?這不僅僅是個人偏好,還是有「for」的真正優勢? – 2009-09-13 01:59:30

+0

@Click:很難判斷訂單對象的創建是否未在此處發佈。我通過json獲取屬性數量是通過字符串創建的,如{amount:「30」,...},並且這將導致此問題 – Chii 2009-09-13 02:01:11

1

使用parseFloat()parseInt()功能將字符串轉換爲適當的類型。