Який краще?
Я запитую це лише заради того, щоб поголити кілька байтів, оскільки я можу використовувати + x замість числа (x). Чи робить парсефлор щось краще?
Який краще?
Я запитую це лише заради того, щоб поголити кілька байтів, оскільки я можу використовувати + x замість числа (x). Чи робить парсефлор щось краще?
Відповіді:
parseFloat
/ parseInt
- для розбору рядка, а Number
/ +
- для примусового значення до числа. Вони поводяться по-різному. Але спочатку давайте подивимось, де вони поводяться однаково:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
Отже, якщо у вас є стандартний цифровий вхід, різниці немає. Однак якщо ваш вхід починається з числа, а потім містить інші символи, parseFloat
обрізає число з рядка, при цьому Number
дає NaN
(а не число):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Крім того, Number
розуміє шістнадцятковий вхід, а parseFloat
не:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Але Number
виглядає дивно з порожніми рядками або рядками, що містять лише пробіл:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
В цілому я вважаю Number
себе більш розумним, тому майже завжди користуюся Number
особисто (і ви побачите, що багато внутрішніх функцій JavaScript також використовується Number
). Якщо хтось із типів, '1x'
я вважаю за краще відображати помилку, а не ставитися до неї так, як ніби вони ввели '1'
. Єдиний раз, коли я дійсно роблю виняток - це коли я перетворюю стиль у число, і в цьому випадку parseFloat
корисно, тому що стилі надходять у форму, як '3px'
, в такому випадку я хочу скинути 'px'
частину і просто отримати 3
, тому я вважаю parseFloat
корисним тут. Але дійсно, яку саме з них ви виберете, залежить від вас і які форми введення ви бажаєте прийняти.
Зауважте, що використання унарного +
оператора точно таке ж, як використання Number
функції:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Тому я зазвичай просто використовую +
короткий. Поки ви знаєте, що це робить, мені це легко читати.
Number()
як "дивний", я б навіть вважав це більш очікуваним, пробіл - це порожнє значення, але це не null / undefined => 0 - хороший результат. Великий (+) для вас на вітринах все одно :)
Number('Infinity') === Infinity
колиparseInt('Infinity') === NaN
+
для цього (унарний плюс), тому що якщо ви забудете крапку з комою в попередньому рядку, замість цього може бути оцінено вираз додавання.
Різниця полягає в тому, що відбувається, коли вхід не є "належним числом". Number
повертається NaN
під час parseFloat
розбору "наскільки це можливо". Якщо викликається, порожня рядок Number
повертається, 0
а parseFloat повертається NaN
.
Наприклад:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
хоча
NaN != NaN
значення TRUE , - спасибі за підказку!
isNaN(NaN)
повертаєтьсяtrue
У цих прикладах ви бачите різницю:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
parseFloat трохи повільніше, тому що він шукає першу появу числа в рядку, тоді як кондуктор Number створює новий екземпляр числа з рядків, який містить числові значення з пробілом або містить помилкові значення.
PS Якщо вас цікавлять якісь універсальні рішення типу перетворення, ви можете прочитати публікацію про перетворення типів у моєму блозі: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
Для порожнього рядка вони різні.
+""
і Number("")
повертає 0, тоді як parseFloat("")
повертає NaN.
parseFloat()
має правильний результат, оскільки порожня рядок НЕ число 0
(читайте: NaN), а рядок із символом "0"
у ньому є 0
;
+x
повертає 0
не тільки порожній рядок, але й будь-які рядки, що містять лише пробіли. Приклади: +" "
, +"\t\t\t"
, +"\n\n"
- всі вони дають 0
в результаті
Наскільки я знаю, і це лише підслуховується від колег, так що, можливо, було б погано поінформовано, що parseFloat є незначно швидшим.
Хоча при подальшому дослідженні, здається, що ця різниця в продуктивності залежить від браузера.
http://jsperf.com/parseint-vs-parsefloat/6
Подивіться на ці результати jsPerf і змусьте вас телефонувати. (вона також включає + x тести)
Як зазначається у відповіді @xdazz, +""
і Number("")
повертайтеся, 0
поки parseFloat("")
повертається NaN
так. Знову я б пішов з parseFloat, оскільки порожня рядок НЕ означає число 0, лише рядок із символом "0"
у ньому означає 0;
parseFloat()
все-таки переможець.