Попробуйте выполнить следующее в 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 думает, что ведущий ноль указывает восьмеричное целое число , и, поскольку в base-8 нет "8"
ни одного, или "9"
функция возвращает ноль. Как ни крути, это по замыслу .
Какие обходные пути?
Примечание. Для полноты картины я собираюсь опубликовать решение, но это решение, которое я ненавижу, поэтому, пожалуйста, публикуйте другие / лучшие ответы.
Обновить:
В 5-м издании стандарта JavaScript ( ECMA-262 ) вводятся серьезные изменения, устраняющие это поведение. У Mozilla хорошая рецензия .
javascript
integer
octal
Портман
источник
источник
10
(десятичное), если только перед анализируемым числом не указан префикс0x
, например0xFF
, в этом случае для базового параметра по умолчанию установлено значение 16. Надеюсь, однажды эта проблема будет далеким воспоминанием.+'08' === 8
? Правда! Может быть, вам действительно нуженparseInt
ваш реальный код, но не выше.Number('08')
0
илиundefined
и номер строки начинается с0
цифры, за которой не следуетx
ни «X
, ни» , тогда реализация может по своему усмотрению интерпретировать число как восьмеричное или как десятичное. В этом случае реализации рекомендуется интерпретировать числа как десятичные. " ( мой акцент)Ответы:
Это распространенная ошибка в Javascript с простым решением:
Просто укажите основание , или 'основание', вот так:
Вы также можете использовать номер :
источник
Если вы знаете, что ваше значение будет находиться в 32-разрядном целочисленном диапазоне со знаком , тогда все
~~x
будет правильно.Если вы посмотрите двоичный файл not (
~
), спецификация требует преобразования «ToInt32» для аргумента, который выполняет очевидное преобразование в Int32 и определено для приведенияNaN
значений к нулю.Да, это невероятно хакерски, но так удобно ...
источник
Из документации parseInt используйте необязательный аргумент radix, чтобы указать base-10:
Это кажется мне педантичным, запутанным и многословным (действительно, дополнительный аргумент в каждом отдельном parseInt?), Поэтому я надеюсь, что есть лучший путь.
источник
parseInt
для удобного использования в функциональных выражениях, какmap
в["7","4","09","5"].map(parseInt);
Map
проедут индекс элемента в массиве в качестве второго аргумента, который будет интерпретироватьсяparseInt
как базовый, если вы не заключите его в обертку.edit: сделать свою собственную функцию, делать то, что вы действительно хотите, это просто вариант, если вам не нравится все время добавлять ", 10" в вызов parseInt (). Недостатком является нестандартная функция: она удобнее для вас, если вы часто ее используете, но, возможно, больше сбивает с толку других.
источник
Укажите базу:
источник
Было бы очень непослушно заменить parseInt версией, которая предполагает десятичность, если у нее нет второго параметра? (примечание - не проверено)
источник
parseInt("0xFFFFFF") === 16777215
но с твоим непослушным хакером это больше не работаетparseInt("0xFFFFFF") === 0
и для хорошей меры
MDN Link
источник
Как насчет этого для десятичной:
источник
Если вы уже выполнили кучу кодирования с помощью parseInt и не хотите добавлять «10» ко всему, вы можете просто переопределить функцию, чтобы сделать base 10 по умолчанию:
Это может сбить с толку более позднего читателя, поэтому создание функции parseInt10 () может быть более понятным. Лично я предпочитаю использовать простую функцию, чем постоянно добавлять «10» - просто создает больше возможностей для ошибок.
источник
Эта проблема не может быть воспроизведена в последних версиях Chrome и Firefox (2019).
источник