旧版本的javascript评估(“-1”< 0)为false?

时间:2013-09-09 07:58:36

标签: javascript

我兄弟的电子商务网站上的一些js计算并存储每次有人结账时的交易总额。定期为tracker_total_amount存储负值。当他试图弄清楚为什么时,他决定硬编码覆盖,这应该用无意义的值来解决约0.1%的交易。它看起来像这样:

var tracker_total_amount = parseFloat(tracker.total_amount).toFixed(2);
    if(tracker_total_amount < 0){
        tracker_total_amount = 0;
    }

负值继续出现在系统中。

原始理论:

我不认为他应该使用.toFixed,因为这会将tracker_total_amount转换为字符串 - 在我看来,它会阻止if&lt; 0条件按预期工作。在我测试它并且覆盖工作之前,我对这个解释非常满意。见这里:http://jsfiddle.net/yXTrz/

新理论:

不同的用户正在运行不同版本的javascript。一些非常小的子集使用古老版本的javascript(而不是像我一样将字符串转换为浮点数)继续将其视为字符串,并始终将tracker_total_amount评估为&gt; 0,防止覆盖被触发。

问题:

旧版本的javascript是否以这种方式运行?有些用户仍然可以运行这些旧版本吗?最重要的是 - 有没有一种方法可以模拟遗留版本的javascript来证明我的理论?

编辑:我应该指出所有重要的东西(付款等)都依赖于服务器端的计算值。这里的数字就是之后存储在Google Analytics中的数据,因此 - 虽然可以操作 - 但结果不会太糟糕。

3 个答案:

答案 0 :(得分:2)

您可以获得非常小的负值,即-0.001,因为该值设置为固定。不确定你看到了什么样的负面影响,但任何超出固定值的负面影响将允许负面影响。对不起,应该更清楚,如果有进一步的计算不使用返回的值而不是原始值...返回的值将是-0.00 ...所以如果这只是用作测试...

答案 1 :(得分:1)

不确定旧版本的Javascript是否以不同方式处理您的号码的字符串表示,但是您应该能够在检查该号码是否在范围内之后使用toFixed()来解决问题:

var tracker_total_amount = parseFloat(tracker.total_amount);
if (tracker_total_amount < 0) {
    tracker_total_amount = 0;
}
tracker_total_amount = tracker_total_amount.toFixed(2);

答案 2 :(得分:1)

  • 关于'为什么':@凯文的回答是正确的,您可以在链接的代码上查看它。
  • 关于'如何解决':@Nerdwood的答案很棒。以数字类型进行所有计算(按预期进行舍入),并仅在边界处进行转换。

但我想补充两点来检查:

  • 确保您的JS代码已正确版本化,以便客户端浏览器在没有“修复”的情况下不会获取缓存版本。
  • 确保此字段未在其他位置设置或更新。