为什么 >=(大于或等于)比较在 Javascript 中不起作用?
Why doesn't >= (greater than or equals) comparison work in Javascript?
我在这里错过了什么?这个剧本对我来说很合适。
但出于某种原因,当我向它发送邮政编码 02897(或任何应该是罗德岛的邮政编码)时,它 returns 新罕布什尔州。除了 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;
}
如果数字在 javascript 中以零开头,则可以将其视为八进制。
引用自以下文档...
If the input string begins with "0", radix is eight (octal) or 10
(decimal). Exactly which radix is chosen is implementation-dependent.
ECMAScript 5 specifies that 10 (decimal) is used, but not all browsers
support this yet. For this reason always specify a radix when using
parseInt.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
然而,这并不是这里唯一起作用的东西。如果您只比较转换为小数的八进制,您将得到您期望的输出。在 chrome 43 中,传入一个无法转换为八进制的数字(任何数字都有 8 或 9)将保留它作为基数 10。
这可能就是为什么罗德岛之前的 if
陈述给了您预期的输出。例如,您可能已经传递了一个 03274 的 zip 期望新罕布什尔州,并且您会得到您期望的结果。 if 语句实际上是这样做的...
03274 >= 03000 && 03274 <= 03899
转换为...
1724 >= 1536 && 1724 <= 3899
但是,当您通过 02897 期望罗德岛时,逻辑将在新罕布什尔州的 if 语句上评估为 True。这是实际比较...
02897 >= 03000 & 02897 <= 03899
转换为....
2897 >= 1536 && 2897 <= 3899
请参阅 Kevin 的回答,了解如何实际修复函数以使其按预期工作。
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
我在这里错过了什么?这个剧本对我来说很合适。
但出于某种原因,当我向它发送邮政编码 02897(或任何应该是罗德岛的邮政编码)时,它 returns 新罕布什尔州。除了 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;
}
如果数字在 javascript 中以零开头,则可以将其视为八进制。
引用自以下文档...
If the input string begins with "0", radix is eight (octal) or 10 (decimal). Exactly which radix is chosen is implementation-dependent. ECMAScript 5 specifies that 10 (decimal) is used, but not all browsers support this yet. For this reason always specify a radix when using parseInt.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
然而,这并不是这里唯一起作用的东西。如果您只比较转换为小数的八进制,您将得到您期望的输出。在 chrome 43 中,传入一个无法转换为八进制的数字(任何数字都有 8 或 9)将保留它作为基数 10。
这可能就是为什么罗德岛之前的 if
陈述给了您预期的输出。例如,您可能已经传递了一个 03274 的 zip 期望新罕布什尔州,并且您会得到您期望的结果。 if 语句实际上是这样做的...
03274 >= 03000 && 03274 <= 03899
转换为...
1724 >= 1536 && 1724 <= 3899
但是,当您通过 02897 期望罗德岛时,逻辑将在新罕布什尔州的 if 语句上评估为 True。这是实际比较...
02897 >= 03000 & 02897 <= 03899
转换为....
2897 >= 1536 && 2897 <= 3899
请参阅 Kevin 的回答,了解如何实际修复函数以使其按预期工作。
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