为什么';t>;=(大于或等于)Javascript中的比较工作?

为什么';t>;=(大于或等于)Javascript中的比较工作?,javascript,comparison-operators,Javascript,Comparison Operators,我错过了什么?我觉得这个剧本不错 但由于某种原因,当我给它发送一个zipcode 02897(或者任何应该是罗德岛的东西)时,它返回了新罕布什尔州。除了Javascript开发人员可能有的政治信仰(当然大多数人更喜欢住在新罕布什尔州而不是罗德岛),为什么这个脚本不起作用 新泽西州和阿拉巴马州的情况很好。为什么罗德岛不能得到一些爱 function getState(zip) { var thiszip = zip; // parseInt(zip); if (thiszip &g

我错过了什么?我觉得这个剧本不错

但由于某种原因,当我给它发送一个zipcode 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;
}
函数getState(zip){ var thiszip=zip;//parseInt(zip);
如果(thiszip>=35000&&thiszip=03000&&thiszip=07000&&thiszip=02800&&thiszip如果一个数字在javascript中以零开头,则可以将其视为八进制

引用下列文件

如果输入字符串以“0”开头,则基数为8(八进制)或10 (十进制)。具体选择哪个基数取决于实现。 ECMAScript 5指定使用10(十进制),但不是所有浏览器 但仍支持此操作。因此,在使用时始终指定基数 帕森特

然而,这并不是唯一的问题。如果你只是比较小数形式的八进制,你会得到你期望的输出。在chrome 43中,传入一个不能转换为八进制的数字(任何数字都有8或9)将保持它作为基数10

这可能就是为什么罗德岛州之前的
if
语句为您提供了您所期望的输出。例如,您可能通过了邮政编码03274的新罕布什尔州,您将得到您所期望的。if语句实际上正在这样做

03274 >= 03000 && 03274 <= 03899

03274>=03000&&03274=1536&&1724
03000
等于
1536
,以十进制表示

这是因为前导零导致值被解释为八进制

既然最后你在做数值比较,为什么不在比较中省略前导零呢

else if (thiszip >= 3000 && thiszip <= 3899) {
您可能希望
parseInt
传入的值:

var thiszip = parseInt(zip, 10);

请添加一个jsfiddleJavaScript将忽略zipI前面的0。zipI评论说JS将忽略0,这很可能是错误的。我假设JavaScript会将其解释为一个数字,但我认为有一种说法是关于假设的!这是两个问题的组合。如果你
console.log
02897,如果你记录0,你会得到28973000你得到1536。它被解释为一个数字,但不是十进制,而是八进制,这是处理邮政编码时最大的问题。哇,我知道它一定是这样奇怪的。在javascript中默认为八进制值。喜欢它。谢谢你的快速回答。现在,你有三条指令来修复它,以这种形式:do A或B和C。你能添加括号吗?是,做A或(B和C)还是,做(A或B)和C?我知道这已经很长时间了,但这在Chrome中对我不起作用。我发现
parseInt(00300,10)
返回192。偶数
Number(00300)
返回192。@TonyBrasunas传递给
parseInt
的值需要是字符串:
parseInt(“00300”,10)
。但是,您不能这样做:
parseInt(00300.toString(),10)
因为八进制将首先计算,因此字符串将为192。我不确定是一直如此,还是引擎已经改变了。@TonyBrasunas我想这会满足您的需要:
00300.toString(8)
(产生“300”)(哇,伟大的发现。所以您可以将
基数传递到
toString()
就像您在
parseInt()
中所做的那样。如果将非字符串传递到函数中,这可能足以替换否则抛出的错误。
2897 >= 1536 && 2897 <= 3899
else if (thiszip >= 3000 && thiszip <= 3899) {
else if (thiszip >= parseInt(03000, 10) && thiszip <= parseInt(03899, 10)) {
                                 // ^^^ pass radix parameter          ^^^ pass radix parameter
var thiszip = parseInt(zip, 10);