2015-04-21 3 views
-1

Почему Javascript ParseInt ('0x4Avv') возвращают то же самое, как ParseInt ('0x4a') Я рассчитывал на ParseInt ('0x4Avv') вернуть NaN.Почему Javascript parseInt ('0x4A') возвращает то же самое, что и parseInt ('0x4Avv')?

Есть ли способ заставить его вести себя как таковой?

Даже странно струны 'работа', например: ParseInt ('0x4Av - 9-0-90v') дает тот же результат, как ParseInt ('0x4a')

Соблю во всех браузерах. ...

ответ

6

Вот выдержка из документации MDN ParseInt

Если ParseInt обнаруживает символ, не являющийся цифрой в указанной системе счисления, то игнорирует его и все последующие символы и возвращает целое число значение проанализировано до этой точки. parseInt обрезает цифры целыми значениями. Допускаются ведущие и конечные пробелы.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt

Существует не встроенный способ заставить его вести себя иначе, но вы, вероятно, может написать свой собственный Int синтаксического анализа функции с использованием регулярных выражений, которые могли бы быть более строгим.

4

Функция parseInt() не заботится о возврате мусора в исходную строку. Функция parseFloat() разделяет это поведение.

Если вы хотите, чтобы преобразовать строку в число и сделать это таким образом, чтобы обеспечить строка была «все количество», вы можете использовать + унарный оператор:

var num = +someString; 

Это дает вам ряд JavaScript, поэтому, если вы хотите, целое число, вы можете вместо этого использовать один из них:

var intval = ~~someString; 
var intval = someString|0; 

кормления плохих строк, как в ваших примерах любой из этих методов оставит вас с NaN.

+0

Примечание: source string - это шестнадцатеричная строка '0x4A', а не только строка мусора. –

+0

@limelights да Я это признаю; Дело в том, что синтаксический анализатор, встроенный в функцию 'parseInt()', просто прекращает разбор, когда видит то, чего он не ожидает. – Pointy

+0

Так жаль, я не обиделся! Просто хотел уточнить для ОП. –

3

parseInt игнорирует все после недопустимого числа.

Вот небольшой пример его поведения.

parseInt("12ab") // radix asumed to 10 since there isn't specified. 
// 1 -> valid number 
// 2 -> valid number 
// a -> not valid number, DROP everything after this including this.. 
// 
// so it endup behaving like: 
parseInt("12") // 12 
1

Как отмечался в предыдущих ответах, как parseInt и parseFloat преобразуют все входы в строку, а затем пытаться разобрать все числовые значения до первого не-числового значения (см MDN documentation для дальнейшего чтения). Однако, если вы пытаетесь бросить строку в число и желание, чтобы оно возвращает значение NaN, если вся строка не представляет собой число, которое Вы можете использовать Number глобальный объект, чтобы сделать так:

> Number('0x4Avv') 
NaN 
> Number('0x4A') 
74 
> Number('0x4Av--9-0-90v') 
NaN