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