听起来很疯狂,我知道。但是我遇到了一个奇怪的数学/数组相关错误,该错误只发生在手机上。
这可能是一个 jQuery 错误,但我不确定。
当我注意到一个项目不断返回 NaN 时,我正在做一些数字运算,特别是数组中的第一个项目。
var taxBrackets = {
//if this number or higher
0: 0.95, //5%
1950000: 0.90, //10%
3300000: 0.80, //20%
6950000: 0.77, //23%
9000000: 0.67, //33%
18000000: 0.60, //40%
40000000: 0.55, //45%
};
var exp = [
30000, //rent
1098, //phone
5143, //wifi
15000, //commuter pass
1500, //health
];
function calculate(hoursPerWeek, daysPerWeek, trainFare, wage) {
data = [];
var taxRate = 1;
data['total'] = Math.floor(wage * hoursPerWeek * 4);
data['tax'] = data['total'] * 12;
for (key in taxBrackets) {
if (data['tax'] < key) {
break;
}
taxRate = taxBrackets[key];
}
data['total'] = data['total'] * taxRate;
data['total'] = data['total'] + (daysPerWeek * 4 * (trainFare * 2));
data['monthly'] = data['total'];
data['yearly_total'] = data['total'] * 12;
for (var n = 0; n < exp.length; n++) {
data['monthly'] = data['monthly'] - exp[n];
}
data['weekly'] = Math.floor(data['monthly'] / 4);
data['daily'] = Math.floor(data['monthly'] / 30);
data['taxRate'] = Math.round((1 - taxRate) * 100) + "%";
return data;
}
res = calculate(24, 3, 480, 1000);
for (let key in res) {
console.log(key, res[key])
}
无论如何,你可以在这里自己看看。 https://jsfiddle.net/frogg616/vg6r0v4g/
税率为5%的图表在手机上显示为NaN,但在电脑上显示。(在iPhone SE iOS 10和iPhone 5S iOS 9上测试)
那么,我的问题是移动 JavaScript 和计算机 JavaScript 有什么不同吗?如果是这样,我在哪里可以找到有关它们差异的更多信息?
最佳答案
您的问题是 Javascript 对象中的键没有排序。处理案例的顺序不是由语言定义的,因此不能保证 5% 的括号会在其他括号之前被检查。如果没有为 taxRate
赋值,它将是 undefined
,对其执行任何进一步的算术运算将导致 NaN
结果。
(这并不特定于桌面浏览器与移动浏览器。碰巧您使用的桌面浏览器的行为与 iOS 上的 Safari 不同。)
不要为此使用对象。使用一系列 if
和 else
语句,例如
if (income < 1950000)
taxRate = 0.95;
else if (income < 3300000)
taxRate = 0.90;
...
else
taxRate = 0.55;
关于javascript - 移动 JavaScript 与桌面 JavaScript 不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46761633/