В чем разница между parseInt () и Number ()?


Ответы:


457

Ну, они семантически разные , 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

Интересно, parseInt игнорирует какие-либо символы, заканчивающиеся числом? Потому что в моем случае я бы предпочел получить NaN вместо 20 при конвертации.
Отметить

Да, это так. Похоже, вы определенно хотите номер ()
Гарет

Итак, я думаю, я пойду с Number (), но большое спасибо за прояснение этого пункта и всех этих примеров! :-)
Марк

1
Спасибо тебе за это. Это первый раз, когда я видел NaN. Некоторым людям может быть полезно знать, что NaN тестируется с помощью функции isNaN (значение). Например, использование «if (value == NaN)» не сработает.
WonderfulDay

1
Number()имеет дело с восьмеричными так же, как шестнадцатеричные и двоичные:Number('0o10') == 8
Хуан Мендес

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

первые два обеспечат вам лучшую производительность, так как он возвращает примитив вместо объекта.


20
new Number()отличается от Number(). typeof Number("123") => number
Гарет

8
Также new Number("1") != new Number("1"). НИКОГДА НЕ ИСПОЛЬЗОВАТЬnew Number . Никогда, никогда, никогда. Number("1")с другой стороны, вполне разумно.
Краген Хавьер Ситакер

18
@Kragen, было бы гораздо более полезным для сообщества , если вы объяснили , почему вы не должны использовать «новый номер» - вместо того , чтобы просто набрав «никогда» 5 раз ...
кен

1
@ken Очень старый комментарий, но для будущих посетителей я представляю его, потому что именно поэтому они упомянули для начала. Я разобрать два числа , let x = new Number("2"); let y = new Number("2");а затем в дальнейшем делать проверку равенства по какой - либо причине, if (x == y) { doSomething(); }логически doSomethingследует. Но это не так. Кроме того, если вы должны были разобрать только один номер , let x = new Number("2");то x === 2было бы ложным. Это явная причина, почему вы не должны использоватьnew Number
Том C

1
@TomC Вы видите результат отредактированного комментария (это то, что обозначает значок карандаша после комментария); ранее было нулевое объяснение, только сильное предупреждение.
Кен

15

Если вы ищете производительность, то, вероятно, лучшие результаты вы получите с побитовым сдвигом вправо "10">>0. Также умножить ( "10" * 1) или нет ( ~~"10"). Все они гораздо быстрее Numberи parseInt. У них даже есть «особенность», возвращающая 0 для не числового аргумента. Вот тесты производительности .


1
Скорость различных подходов, по-видимому, меняется со временем в версиях браузера. Связанный тест также изменился, и последняя версия этого комментария находится здесь - jsperf.com/number-vs-parseint-vs-plus/39 - к счастью, сайт также содержит предыдущие версии теста
bobo

@ Бобо, конечно. Из любопытства проверил с хромом - Numberи parseIntвсе же медленнее на 99%, чем у остальных. Плюс ко мне они менее привлекательны визуально :-)
Saulius

15
Всегда предпочитайте ясность кода над «бесполезными» оптимизациями. Для большинства случаев использования parseIntили Numberявляются более предпочтительными. Если вы программируете эмулятор N64 с миллионами конверсий в секунду, вы можете рассмотреть эти приемы.
ngryman

1
Вопрос о поведении, обсуждение производительности не по теме.
пневматика

1
Обратите внимание, что это нельзя использовать для больших целых чисел - в частности, целых чисел, которые не помещаются в 32-разрядное целое число со знаком - потому что в JavaScript побитовые операторы обрабатывают свои операнды как последовательность из 32 битов, а не как десятичное число, шестнадцатеричные или восьмеричные числа. Следовательно (2**31).toString() >> 0переполнится до -2147483648. Вы можете использовать >>>вместо того, >>чтобы JavaScript обрабатывал операнд как 32-разрядное целое число без знака , но затем любые числа, которые больше 2**32 - 1, также будут переполнены.
HASC


6

Одно из отличий второстепенного что они превращают в undefinedили null,

Number() Or Number(null) // returns 0

пока

parseInt() Or parseInt(null) // returns NaN

6

Резюме:

parseInt():

  • Принимает строку в качестве первого аргумента, основание (целое число, которое является основой системы счисления, например, десятичная 10 или двоичная 2) в качестве второго аргумента
  • Функция возвращает целое число, если первый символ не может быть преобразован в число, NaNбудет возвращено.
  • Если parseInt()функция встречает не числовое значение, она обрезает оставшуюся часть входной строки и анализирует только часть до не числового значения.
  • Если основание равно undefinedили 0, JS примет следующее:
    • Если входная строка начинается с «0x» или «0X», основание равно 16 (шестнадцатеричное), остаток строки разбирается в число.
    • Если входное значение начинается с 0, основание может быть 8 (восьмеричное) или 10 (десятичное). Выбор радиуса зависит от реализации движка JS. ES5указывает, что 10 следует использовать тогда. Однако это поддерживается не всеми браузерами, поэтому всегда указывайте основание, если ваши числа могут начинаться с 0.
    • Если входное значение начинается с любого числа, основание будет 10

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


5

Я всегда использую parseInt, но остерегайтесь ведущих нулей, которые приведут его в восьмеричный режим.


35
Я думаю, что это всегда хорошая идея - поставить основание parseInt(value, radix)таким образом, чтобы у вас не было случайных восьмеричных преобразований мод и т. Д.
awesomo

Ведущие нули приведут его к восьмеричному режиму в ECMAScript 3. ECMAScript 5 будет анализировать его 0даже в нестрогом режиме. Но это было исправлено, и теперь ведущие нули просто игнорируются, так parseInt("070")что станет 70.
Пиотрек Гричук,

2
Вы должны также использовать линтер, который предупредит вас предоставить основную величину в parseInt().
Джастин

2

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()функцию


1

parseInt преобразует в целое число, то есть он удаляет десятичные дроби. Число не конвертируется в целое число.


1

Это хорошая идея держаться подальше от 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 для некоторых других его качеств, никогда не используйте его для преобразования чисел с плавающей точкой в ​​целые.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.