为什么在Javascript中> =(大于或等于)比较工作?

时间:2015-08-07 00:50:14

标签: javascript comparison-operators

我在这里缺少什么?这个脚本对我来说很合适。

但出于某种原因,当我发送一个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;
}

2 个答案:

答案 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的答案,了解如何实际修复该功能以按预期工作。