奇怪的javascript添加问题

时间:2009-09-13 01:49:33

标签: 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。所以我认为它将数量一起添加为字符串而不是整数。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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,除了数字索引之外,这些属性也将被迭代。

避免它的另一个原因是因为此语句使用的迭代顺序是任意,并且迭代数组可能无法按数字顺序访问元素,而且它似乎更多{ {3}}比简单的for循环。

如果迭代顺序不重要,我个人喜欢向后迭代:

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

答案 1 :(得分:1)

使用parseFloat()parseInt()函数将字符串转换为适当的类型。