【问题标题】:Why doesn't >= (greater than or equals) comparison work in Javascript?为什么 >=(大于或等于)比较在 Javascript 中不起作用?
【发布时间】:2015-10-30 07:48:30
【问题描述】:

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

但由于某种原因,当我向它发送 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
  • JavaScript 会忽略 zip 前面的 0

标签: javascript comparison-operators


【解决方案1】:

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?
  • 我知道这已经很长时间了,但这在 Chrome 中对我不起作用。我发现 parseInt(00300, 10) 返回 192。甚至 Number(00300) 返回 192。
  • @TonyBrasunas 传递给parseInt 的值需要是一个字符串:parseInt("00300", 10)。但是,您不能这样做:parseInt(00300.toString(), 10),因为将首先计算八进制数,因此您的字符串将是 192。我不确定是不是一直都是这样,还是引擎发生了变化。
  • @TonyBrasunas 我认为这会满足您的需求:00300.toString(8)(产量“300”。)
  • 哇,伟大的发现。所以你可以将radix 传递给toString(),就像你传递给parseInt() 一样。如果将非字符串传递给函数,这可能足以替换我否则抛出的错误。
【解决方案2】:

如果一个数字在 javascript 中以零开头,它可以被视为八进制。

引用以下文档...

如果输入字符串以“0”开头,则基数为八(八进制)或 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 的邮编,期待 New Hampshire 并且您会得到您所期望的。 if 语句实际上是这样做的……

03274 >= 03000 && 03274 <= 03899

转换为...

1724 >= 1536 && 1724 <= 3899

但是,当您传入 02897 并期望 Rhode Island 时,逻辑将在新罕布什尔州的 if 语句中评估为 True。这是实际的比较...

02897 >= 03000 & 02897 <= 03899

转换为....

2897 >= 1536 && 2897 <= 3899

请参阅 Kevin 的回答,了解如何实际修复该功能以使其按预期工作。

【讨论】:

  • 我评论说 JS 会忽略 0 这很可能是错误的,实际上。我认为 JavaScript 会将其解释为一个数字,但我认为有一种说法是关于假设的!
  • 这是两个问题的结合。如果你 console.log 02897 你会得到 2897 如果你登录 03000 你会得到 1536。
  • 嗯,它被解释为数字,但不是十进制,而是八进制,这是处理邮政/邮政编码时最大的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多