Как вести себя 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
первые два обеспечат вам лучшую производительность, так как он возвращает примитив вместо объекта.
источник
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
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
источник
Одно из отличий второстепенного что они превращают в
undefined
илиnull
,пока
источник
Резюме:
parseInt()
:NaN
будет возвращено.parseInt()
функция встречает не числовое значение, она обрезает оставшуюся часть входной строки и анализирует только часть до не числового значения.undefined
или 0, JS примет следующее:ES5
указывает, что 10 следует использовать тогда. Однако это поддерживается не всеми браузерами, поэтому всегда указывайте основание, если ваши числа могут начинаться с 0.Number()
:Number()
Конструктор может преобразовать любой входной аргумент в число. ЕслиNumber()
конструктор не может преобразовать ввод в число,NaN
будет возвращено.Number()
Конструктор также может обрабатывать шестнадцатеричное число, они должны начать с0x
.Пример:
источник
Я всегда использую parseInt, но остерегайтесь ведущих нулей, которые приведут его в восьмеричный режим.
источник
parseInt(value, radix)
таким образом, чтобы у вас не было случайных восьмеричных преобразований мод и т. Д.0
даже в нестрогом режиме. Но это было исправлено, и теперь ведущие нули просто игнорируются, такparseInt("070")
что станет70
.parseInt()
.parseInt()
-> Парсит число до указанного редикса.Number()
-> Преобразует указанное значение в его числовой эквивалент или NaN, если это не удается сделать.Следовательно, для преобразования нечислового значения в число мы всегда должны использовать функцию Number ().
например.
Существуют различные угловые случаи для
parseInt()
функций, так как они выполняют преобразование с помощью редиксов, поэтому мы должны избегать использования функции parseInt () для целей приведения.Теперь, чтобы проверить погоду, предоставленное значение является Числовым или нет, мы должны использовать встроенную
isNaN()
функциюисточник
parseInt преобразует в целое число, то есть он удаляет десятичные дроби. Число не конвертируется в целое число.
источник
Это хорошая идея держаться подальше от parseInt и использовать Number и Math.round, если вам не нужен hex или восьмеричный. Оба могут использовать строки. Зачем держаться подальше от этого?
Это полностью мясники действительно больших или очень маленьких чисел. Как ни странно, он работает нормально, если эти входные данные являются строкой.
Вместо того, чтобы рисковать, чтобы найти ошибки с этим и другими упомянутыми людьми, я просто избегал parseInt, если вам не нужно анализировать что-то отличное от базы 10. Number, Math.round, Math.foor и .toFixed (0) могут все делать то же самое, для чего можно использовать parseInt, не имея ошибок такого типа.
Если вы действительно хотите или должны использовать parseInt для некоторых других его качеств, никогда не используйте его для преобразования чисел с плавающей точкой в целые.
источник