为什么在Javascript中不能使用大于等于(>=)比较符?

3

我在这里缺少什么?这个脚本看起来没问题。

但是出于某种原因,当我发送邮政编码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;
}

请添加一个 jsfiddle。 - Ray
JavaScript 会忽略 ZIP 前面的 0。 - DylanB
2个回答

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


哇,我知道它一定是像这样奇怪的东西。在JavaScript中默认为八进制值。太棒了。感谢您的快速回答。现在,您有三个指令来修复它,以此形式:执行A或B和C。你能加上括号吗?是执行A或(B和C)还是执行(A或B)和C? - Tony Brasunas
我知道已经很久了,但这在Chrome中对我不起作用。我发现parseInt(00300, 10)返回192。即使Number(00300)也返回192。 - Tony Brasunas
@TonyBrasunas 传递给 parseInt 的值需要是一个字符串:parseInt("00300", 10)。但是,你不能这样做:parseInt(00300.toString(), 10),因为八进制将首先被计算,因此你的字符串将变成 _192_。我不确定这是否一直是这种情况,还是引擎已经改变了。 - Kevin Boucher
1
@TonyBrasunas 我认为这个可以满足你的需求:00300.toString(8)(输出结果为“300”)。 - Kevin Boucher
1
哇,太棒了的发现。所以你可以像在parseInt()中一样传递一个radixtoString()中。这对我来说可能已经足够了,可以替换掉如果传递非字符串参数时抛出的错误。 - Tony Brasunas
显示剩余2条评论

4
如果JavaScript中的一个数字以零开头,则可以将其视为八进制。以下是来自文档的引用...
如果输入字符串以"0"开头,则基数为8(八进制)或10(十进制)。具体选择哪个基数取决于实现。ECMAScript 5规定使用10(十进制),但并不是所有浏览器都支持此功能。因此,在使用parseInt时始终指定基数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt

然而,这里不仅仅只有这个问题。如果你只比较八进制转换为十进制的结果,那么你将会得到你期望的输出。在Chrome 43中,传入一个无法转换为八进制的数字(任何数字都含有8或9)将保持其作为基数10的形式。
这可能就是为什么在罗德岛之前的if语句给出了你期望的输出。例如,你可能会传入一个邮编03274,期望得到新罕布什尔州的输出,而你也确实得到了你期望的结果。if语句实际上就是这样做的...
03274 >= 03000 && 03274 <= 03899

转换为...

1724 >= 1536 && 1724 <= 3899

然而,当您输入 02897 并期望罗德岛时,逻辑将在新罕布什尔州的 if 语句中返回 True。实际比较如下...
02897 >= 03000 & 02897 <= 03899

转换为....

2897 >= 1536 && 2897 <= 3899

请参考Kevin的答案,了解如何实际修复该函数以使其按预期工作。


我曾经评论过JS会忽略0,但实际上这可能是错误的。我假设JavaScript会将其解释为数字,但我认为有一句话说到了假设的危险! - DylanB
这是两个问题的结合。如果你在控制台中 console.log 02897,你会得到 2897;如果你记录 03000,你会得到 1536。 - abaldwin99
1
它确实被解释为一个数字,但不是十进制的,而是八进制的,这就是在处理邮政编码时最大的问题。 - My1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接