Почему сравнение ›= (больше или равно) не работает в Javascript?

Что мне здесь не хватает? Этот сценарий мне кажется правильным.

Но по какой-то причине, когда я отправляю ему почтовый индекс 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;
}

person Tony Brasunas    schedule 07.08.2015    source источник
comment
Пожалуйста, добавьте jsfiddle   -  person Ray    schedule 07.08.2015
comment
JavaScript будет игнорировать 0 перед zip   -  person DylanB    schedule 07.08.2015


Ответы (2)


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

person Kevin Boucher    schedule 07.08.2015
comment
Вау, я знал, что это должно быть что-то странное. По умолчанию используются восьмеричные значения в javascript. Любить это. Спасибо за Ваш быстрый ответ. Теперь у вас есть три инструкции, чтобы исправить это, в этой форме: сделать A или B и C. Можете ли вы добавить круглые скобки? Делать ли это А или (В и С) или делать (А или В) и С? - person Tony Brasunas; 07.08.2015
comment
Я знаю, что это было давно, но у меня это не работает в Chrome. Я обнаружил, что parseInt(00300, 10) возвращает 192. Даже Number(00300) возвращает 192. - person Tony Brasunas; 28.03.2018
comment
@TonyBrasunas Значение, переданное parseInt, должно быть строкой: parseInt("00300", 10). Однако вы не можете сделать это: parseInt(00300.toString(), 10) потому что сначала будет вычисляться восьмеричное число, и поэтому ваша строка будет 192. Я не уверен, было ли это всегда так, или двигатель изменился. - person Kevin Boucher; 19.04.2018
comment
Так как же обработать входящий параметр, который еще не является строкой? - person Tony Brasunas; 21.04.2018
comment
На самом деле я не могу найти никакого способа справиться с числом, переданным с начальным нулем. Странно, но если zip равен 00300, невозможно правильно оценить функцию. - person Tony Brasunas; 21.04.2018
comment
@TonyBrasunas Я думаю, это сделает то, что вы хотите: 00300.toString(8) (выходит 300.) - person Kevin Boucher; 23.04.2018
comment
вау, отличное открытие. Таким образом, вы можете передать radix в toString() так же, как и в parseInt(). Этого может быть достаточно, чтобы заменить ошибку, которую я в противном случае выдал бы, если в функцию передается не строка. - person Tony Brasunas; 25.04.2018

Если число начинается с нуля в 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, ожидая Нью-Гэмпшир, и вы получите то, что ожидаете. Оператор if на самом деле делает это...

03274 >= 03000 && 03274 <= 03899

превращается в...

1724 >= 1536 && 1724 <= 3899

Однако, когда вы передаете 02897, ожидая, что Род-Айленд, логика будет оцениваться как True в операторе New Hampshire if. Вот собственно и сравнение...

02897 >= 03000 & 02897 <= 03899

превращается в ....

2897 >= 1536 && 2897 <= 3899

См. ответы Кевина о том, как на самом деле исправить функцию, чтобы она работала должным образом.

person abaldwin99    schedule 07.08.2015
comment
Я прокомментировал, что JS будет игнорировать 0, что на самом деле вполне может быть неправильным. Я предполагал, что JavaScript интерпретирует это как число, но я думаю, что есть поговорка о предположениях! - person DylanB; 07.08.2015
comment
Это сочетание обеих проблем. Если вы console.log 02897, вы получите 2897, если вы зарегистрируете 03000, вы получите 1536. - person abaldwin99; 07.08.2015
comment
ну, это интерпретируется как число, но не как десятичное, а восьмеричное, и это самая большая проблема при обработке почтовых / почтовых индексов. - person My1; 13.11.2015