每次有人结账时,我兄弟的电子商务网站上的一些 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 < 0 条件按预期工作。在我测试它并且覆盖工作之前,我对这个解释非常满意。见这里:http: //jsfiddle.net/yXTrz/
新理论:
不同的用户正在运行不同版本的 javascript。一些非常小的子集使用古老版本的 javascript(而不是像我正在做的那样将字符串转换为浮点数)继续将其视为字符串并始终将 tracker_total_amount 评估为 > 0,从而防止覆盖触发。
问题:
旧版本的 javascript 是否以这种方式运行?一些用户还能运行那些旧版本吗?最重要的是 - 有没有一种方法可以模拟旧版本的 javascript 来证明我的理论?
编辑:我应该指出所有重要的东西(付款等)都依赖于服务器端的计算值。这里的数字只是之后存储在 Google Analytics 中的数据,所以——虽然可以操纵——结果不会太糟糕。