Як 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)
Одне з відмінностей другорядного що вони перетворюють в undefined
або null
,
Number() Or Number(null) // returns 0
поки
parseInt() Or parseInt(null) // returns NaN
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(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.