javascript - описание - преобразовать строку в число jquery




Как я могу работать с октальным поведением parseInt в JavaScript? (6)

Попробуйте выполнить следующее в JavaScript:

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

Я просто усвоил, что JavaScript считает, что начальный ноль указывает восьмеричное целое число , и поскольку в базе 8 нет "8" или "9" , функция возвращает ноль. Нравится вам это или нет, это по дизайну .

Каковы обходные пути?

Примечание. Для полноты я собираюсь опубликовать решение, но это решение, которое я ненавижу, поэтому, пожалуйста, публикуйте другие / лучшие ответы.

Обновить:

В пятом выпуске стандарта JavaScript ( ECMA-262 ) вводится нарушение, которое устраняет это поведение. У Mozilla хорошая write-up .


Вы также можете вместо использования parseFloat или parseInt использовать унарный оператор ( + ).

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

и для хорошей меры

+"09.09"
// => 9.09

Ссылка MDN

Оператор унарного плюса предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если оно еще не было. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в число , поскольку он не выполняет никаких других операций над номером.


Было бы очень непослушно заменять parseInt версией, которая принимает десятичное значение, если у нее нет второго параметра? (примечание - не проверено)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

Если вы знаете, что ваше значение будет в 32-битном целочисленном диапазоне, то ~~x сделает правильную вещь во всех сценариях.

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

Если вы ищете двоичный файл not ( ~ ), для спецификации требуется преобразование «ToInt32» для аргумента, которое делает очевидное преобразование в Int32 и указано, чтобы привести значения NaN в ноль.

Да, это невероятно хаки, но так удобно ...


Если вы уже сделали кучу кодирования с помощью parseInt и не хотите добавлять «, 10» ко всему, вы можете просто переопределить эту функцию, чтобы сделать базу 10 по умолчанию:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

Это может смутить более позднего читателя, поэтому создание функции parseInt10 () может быть более самоочевидной. Лично я предпочитаю использовать простую функцию, чем добавлять «, 10» все время - просто создает больше возможностей для ошибок.


Укажите базу:

var number = parseInt(s, 10);

Это обычная версия Javascript с простым решением:

Просто укажите базу или «radix», например:

parseInt('08',10); // 8

Вы также можете использовать Number :

Number('08'); // 8






octal