Яка різниця між 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

Цікаво, чи розбирає синтаксис ігнорування будь-яких символів, що відслідковують число? Тому що в моєму випадку я вважаю за краще отримати NaN замість 20 при перетворенні.
Марк

Так. Здається, вам точно хочеться номер ()
Гарет

Гаразд, так що я думаю, я піду разом із номером (), але дякую за те, що прояснили цю точку та всі ці приклади! :-)
Марк

1
Дякую за це. Це перший раз, коли я бачив NaN. Деяким людям може бути корисно знати, що NaN перевіряється функцією isNaN (значення). Наприклад, використання "if (value == NaN)" не працює.
Чудовий день

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 Ви бачите результат відредагованого коментаря (саме так позначається значок олівця після коментаря); раніше було нульове пояснення, просто сильне заперечення.
ken

15

Якщо ви шукаєте продуктивність, то, ймовірно, найкращі результати ви отримаєте при бітовому правильному зсуві "10">>0. Також множте ( "10" * 1) чи ні ( ~~"10"). Усі вони набагато швидше Numberі parseInt. Вони навіть мають "функцію", повертаючи 0 за аргумент без числа. Ось ефективні тести .


1
З часом швидкість різних підходів змінюється з переглядами браузера. Пов'язаний тест також змінився, і остання версія цього коментаря знаходиться тут - jsperf.com/number-vs-parseint-vs-plus/39 - на щастя, на сайті містяться і попередні версії тесту
bobo

@bobo, звичайно. З цікавості перевіряється хромом - Numberі parseIntвсе ж повільніше на 99%, ніж решта. Плюс до мене вони також менш привабливі візуально :-)
Сауліус

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()функція стикається з нечисловим значенням, вона відріже решту вхідного рядка і розбере лише частину до нечислового значення.
  • Якщо радіус дорівнює undefined0, 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(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

Замість того, щоб важко ризикувати, щоб знайти помилки з цим та іншими людьми, згаданими людьми, я б просто уникав розбору, якщо вам не потрібно розбирати щось інше, ніж базу 10. Число, Math.round, Math.foor та .toFixed (0) можуть усі робити те саме, що parseInt можна використовувати, не маючи цих типів помилок.

Якщо ви дійсно хочете або потребуєте використання parseInt для деяких інших його якостей, ніколи не використовуйте його для перетворення плавців у ints.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.