Який краще?
Я запитую це лише заради того, щоб поголити кілька байтів, оскільки я можу використовувати + 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()все-таки переможець.