2009-09-13 58 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()功能将字符串转换为适当的类型。