Как вести себя parseInt()
и Number()
вести себя по-разному при преобразовании строк в числа?
Как вести себя parseInt()
и Number()
вести себя по-разному при преобразовании строк в числа?
Ответы:
Ну, они семантически разные , Number
конструктор, вызываемый как функция, выполняет преобразование типов и parseInt
выполняет синтаксический анализ , например:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Имейте в виду, что если parseInt
обнаружит начальный ноль в строке, он будет анализировать число в восьмеричной базе, это изменилось в ECMAScript 5, новой версии стандарта, но потребуется много времени, чтобы войти в реализации браузера (это несовместимость с ECMAScript 3), также parseInt
будет игнорировать завершающие символы, которые не соответствуют ни одной цифре используемой в данный момент базы.
Number
Конструктор не обнаруживает значения в восьмиричном:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Но он может обрабатывать числа в шестнадцатеричном формате, например parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Кроме того, широко используемой конструкцией для выполнения преобразования числовых типов является унарный +
оператор (стр. 72) , он эквивалентен использованию Number
конструктора в качестве функции:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
имеет дело с восьмеричными так же, как шестнадцатеричные и двоичные:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
первые два обеспечат вам лучшую производительность, так как он возвращает примитив вместо объекта.
new Number()
отличается от Number()
. typeof Number("123") => number
new Number("1") != new Number("1")
. НИКОГДА НЕ ИСПОЛЬЗОВАТЬnew Number
. Никогда, никогда, никогда. Number("1")
с другой стороны, вполне разумно.
let x = new Number("2"); let y = new Number("2");
а затем в дальнейшем делать проверку равенства по какой - либо причине, if (x == y) { doSomething(); }
логически doSomething
следует. Но это не так. Кроме того, если вы должны были разобрать только один номер , let x = new Number("2");
то x === 2
было бы ложным. Это явная причина, почему вы не должны использоватьnew Number
Если вы ищете производительность, то, вероятно, лучшие результаты вы получите с побитовым сдвигом вправо "10">>0
. Также умножить ( "10" * 1
) или нет ( ~~"10"
). Все они гораздо быстрее Number
и parseInt
. У них даже есть «особенность», возвращающая 0 для не числового аргумента. Вот тесты производительности .
Number
и parseInt
все же медленнее на 99%, чем у остальных. Плюс ко мне они менее привлекательны визуально :-)
parseInt
или Number
являются более предпочтительными. Если вы программируете эмулятор N64 с миллионами конверсий в секунду, вы можете рассмотреть эти приемы.
(2**31).toString() >> 0
переполнится до -2147483648
. Вы можете использовать >>>
вместо того, >>
чтобы JavaScript обрабатывал операнд как 32-разрядное целое число без знака , но затем любые числа, которые больше 2**32 - 1
, также будут переполнены.
Я нашел две ссылки выполнения сравнения между несколькими способами преобразования string
в int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt()
:
NaN
будет возвращено.parseInt()
функция встречает не числовое значение, она обрезает оставшуюся часть входной строки и анализирует только часть до не числового значения.undefined
или 0, JS примет следующее:
ES5
указывает, что 10 следует использовать тогда. Однако это поддерживается не всеми браузерами, поэтому всегда указывайте основание, если ваши числа могут начинаться с 0.Number()
:
Number()
Конструктор может преобразовать любой входной аргумент в число. Если Number()
конструктор не может преобразовать ввод в число, NaN
будет возвращено.Number()
Конструктор также может обрабатывать шестнадцатеричное число, они должны начать с 0x
.console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
Я всегда использую parseInt, но остерегайтесь ведущих нулей, которые приведут его в восьмеричный режим.
parseInt(value, radix)
таким образом, чтобы у вас не было случайных восьмеричных преобразований мод и т. Д.
0
даже в нестрогом режиме. Но это было исправлено, и теперь ведущие нули просто игнорируются, так parseInt("070")
что станет 70
.
parseInt()
.
parseInt()
-> Парсит число до указанного редикса.
Number()
-> Преобразует указанное значение в его числовой эквивалент или NaN, если это не удается сделать.
Следовательно, для преобразования нечислового значения в число мы всегда должны использовать функцию Number ().
например.
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
Существуют различные угловые случаи для parseInt()
функций, так как они выполняют преобразование с помощью редиксов, поэтому мы должны избегать использования функции parseInt () для целей приведения.
Теперь, чтобы проверить погоду, предоставленное значение является Числовым или нет, мы должны использовать встроенную isNaN()
функцию
parseInt преобразует в целое число, то есть он удаляет десятичные дроби. Число не конвертируется в целое число.
Это хорошая идея держаться подальше от parseInt и использовать Number и Math.round, если вам не нужен hex или восьмеричный. Оба могут использовать строки. Зачем держаться подальше от этого?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
Это полностью мясники действительно больших или очень маленьких чисел. Как ни странно, он работает нормально, если эти входные данные являются строкой.
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
Вместо того, чтобы рисковать, чтобы найти ошибки с этим и другими упомянутыми людьми, я просто избегал parseInt, если вам не нужно анализировать что-то отличное от базы 10. Number, Math.round, Math.foor и .toFixed (0) могут все делать то же самое, для чего можно использовать parseInt, не имея ошибок такого типа.
Если вы действительно хотите или должны использовать parseInt для некоторых других его качеств, никогда не используйте его для преобразования чисел с плавающей точкой в целые.