奇怪的javascript添加问题

Cli*_*ote 1 javascript

我有这个代码:

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

但是,如果我有3个订单,金额为3,1和5,那么totalAmt我得到的不是9 0315.所以我认为它将数量一起添加为字符串而不是整数.

我该如何解决?

CMS*_*CMS 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
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用:

totalAmt = totalAmt + (+order.amount);
totalAmt = totalAmt + Number(order.amount);
totalAmt = totalAmt + parseFloat(order.amount);
// etc...
Run Code Online (Sandbox Code Playgroud)

你也使用for..in循环迭代orders,如果orders是数组,你应该使用普通的for循环:

for (var i = 0; i<orders.length; i++) {
  //...
}
Run Code Online (Sandbox Code Playgroud)

这是因为for ... in语句用于迭代对象属性,对于数组来说它可能很容易使用它,因为它似乎有效,但不推荐它,因为它将迭代对象属性,并且如果您已扩展Array.prototype,那么除了数字索引之外,还将迭代这些属性.

避免它的另一个原因是因为此语句使用的迭代顺序是任意的,并且迭代数组可能不会按数字顺序访问元素,并且它似乎比简单的for循环得多.

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

var i = orders.length;
while (i--) {
   //...
}
Run Code Online (Sandbox Code Playgroud)