【问题标题】:Strange javascript addition problem奇怪的javascript添加问题
【发布时间】:2009-09-13 01:49:33
【问题描述】:

我有这个代码:

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。所以我认为它将金额作为字符串而不是整数加在一起。

我该如何解决这个问题?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    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,除了数字索引之外,这些属性也会被迭代。

    避免它的另一个原因是因为该语句使用的迭代顺序是任意,并且对数组进行迭代可能不会按数字顺序访问元素,而且似乎更多@ 987654323@ 比一个简单的 for 循环。

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

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

    【讨论】:

    • 这就是我想要的。为什么它会将order.amount 转换为字符串?
    • for in 更容易时,为什么我应该使用for 来循环它?这不只是个人喜好还是for 有什么真正的优势?
    • @Click:很难判断订单对象的创建是否未在此处发布。我知道属性 amount 是通过 json 创建为字符串,例如 {amount:"30", ...},这将导致此问题
    • @Click:for...in 语句旨在用于迭代对象属性 (is.gd/3cxtp),对于数组有效但不推荐,因为它会迭代属性,如果你已经扩展了 Array.prototype,这些属性也会被迭代,而且它似乎比简单的 for 循环慢得多(is.gd/3cxPl)...
    • @Click: "for..in" 爬上Array.prototype 链。请参阅 ecma-international.org/publications/standards/Ecma-262.htm(第 12.6.4 节),而标准的 for 循环则没有。此外,不保证使用"for..in" 迭代的项目的顺序。一个标准的for 循环是。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2010-10-02
      • 1970-01-01
      • 2019-11-25
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多