我在这里缺少什么?这个脚本对我来说很合适。
但出于某种原因,当我发送一个02897的邮政编码(或任何应该是罗德岛的邮编)时,它会返回新罕布什尔州。除了Javascript开发人员可能拥有的政治信仰(肯定大多数人更愿意住在新汉普尔而不是罗德岛),为什么这个脚本不起作用?
新泽西州和阿拉巴马州的工作正常。为什么罗德岛不能得到一些爱?
function getState(zip) {
var thiszip = zip; // parseInt(zip);
if (thiszip >= 35000 && thiszip <= 36999) {
thisst = 'AL';
thisstate = "Alabama";
}
else if (thiszip >= 03000 && thiszip <= 03899) {
thisst = 'NH';
thisstate = "New Hampshire";
}
else if (thiszip >= 07000 && thiszip <= 08999) {
thisst = 'NJ';
thisstate = "New Jersey";
}
else if (thiszip >= 02800 && thiszip <= 02999) {
thisst = 'RI';
thisstate = "Rhode Island";
}
else {
thisst = 'none';
}
return thisst;
}
答案 0 :(得分:9)
03000
等于1536
作为小数。
这是因为前导零导致该值被解释为八进制。
由于最终你正在进行数值比较,为什么不在比较中省略前导零?
else if (thiszip >= 3000 && thiszip <= 3899) {
否则,使用parseInt
并声明小数:
else if (thiszip >= parseInt(03000, 10) && thiszip <= parseInt(03899, 10)) {
// ^^^ pass radix parameter ^^^ pass radix parameter
您可能希望parseInt
传入的值:
var thiszip = parseInt(zip, 10);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
答案 1 :(得分:4)
如果一个数字在javascript中以零开头,则可以将其视为八进制。
引用以下文档...
如果输入字符串以&#34; 0&#34;开头,则基数为8(八进制)或10 (十进制)。究竟选择哪个基数是依赖于实现的。 ECMAScript 5指定使用10(十进制),但不是所有浏览器 支持这个。因此,在使用时始终指定基数 parseInt函数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
然而,这不是唯一在这里发挥作用的事情。如果你只是比较十进制的十进制数,你会得到你期望的输出。在chrome 43中传入一个无法转换为octals的数字(任何数字都有8或9)将保留为10。
这可能是罗德岛之前if
语句为您提供预期输出的原因。例如,你可能已经通过03274的拉链预期新罕布什尔州,你会得到你所期望的。 if语句实际上是这样做的......
03274 >= 03000 && 03274 <= 03899
转换为...
1724 >= 1536 && 1724 <= 3899
然而,当你通过02897预期罗德岛时,逻辑将在New Hampshire if语句中评估为True。这是实际比较的结果......
02897 >= 03000 & 02897 <= 03899
转换为....
2897 >= 1536 && 2897 <= 3899
请参阅Kevin的答案,了解如何实际修复该功能以按预期工作。