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--) {
//...
}
來源
2009-09-13 01:52:41
CMS
這就是我想要的。爲什麼在它會將'order.amount'轉換爲字符串呢? – 2009-09-13 01:56:57
爲什麼我應該使用'for'來循環當'for in'更容易?這不僅僅是個人偏好,還是有「for」的真正優勢? – 2009-09-13 01:59:30
@Click:很難判斷訂單對象的創建是否未在此處發佈。我通過json獲取屬性數量是通過字符串創建的,如{amount:「30」,...},並且這將導致此問題 – Chii 2009-09-13 02:01:11