每次有人结账时,我兄弟的电子商务网站上的一些 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(而不是像我正在做的那样有用地将字符串转换为 float )继续将其视为字符串并始终将 tracker_total_amount 评估为 > 0,以防止覆盖触发。
问题:
旧版本的 javascript 是否以这种方式运行?某些用户是否仍在运行那些旧版本?最重要的是 - 有没有一种方法可以模拟旧版本的 javascript 来证明我的理论?
编辑:我应该指出所有重要的东西(付款等)都依赖于服务器端的计算值。此处的数字只是之后存储在 Google Analytics 中的数字,因此 - 虽然可以进行操纵 - 结果不会太糟糕。
最佳答案
您可以获得非常小的负值通过,即 -0.001,因为该值被设置为固定值。不确定您看到的是哪种底片,但任何超出固定值的底片都会让底片通过。对不起,应该更清楚,如果有进一步的计算不使用返回值而不是原始值......返回值将是-0.00 ......所以如果这只是被用作测试......
关于javascript - 旧版本的 javascript 是否将 ("-1"< 0) 评估为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18693819/