为什么 >=(大于或等于)比较在 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