Що краще, число (x) або розбірFloat (x)?


146

Який краще?

Я запитую це лише заради того, щоб поголити кілька байтів, оскільки я можу використовувати + x замість числа (x). Чи робить парсефлор щось краще?


2
Одноточні числа з плаваючою комою займають 4 байти в 32-бітовій системі, а також прості цілі числа. Я не знаю, як обробляється JavaScript, але я думаю, що це майже те саме.
Крістіан

5
@Christian: Усі числа у Javascript - це поплавці подвійної точності.
Guffa

1
Я б проголосував за це питання, якби не сегмент EDIT
LaPuyaLoca

Відповіді:


309

Різниця між parseFloat та Number

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

Тому я зазвичай просто використовую +короткий. Поки ви знаєте, що це робить, мені це легко читати.


2
Я б не вважав, що пробіл => 0 поведінка Number()як "дивний", я б навіть вважав це більш очікуваним, пробіл - це порожнє значення, але це не null / undefined => 0 - хороший результат. Великий (+) для вас на вітринах все одно :)
jave.web

4
@NathanWall: Можливо, хотілося б згадати про те, Number('Infinity') === InfinityколиparseInt('Infinity') === NaN
sstur

3
Я б не використовував +для цього (унарний плюс), тому що якщо ви забудете крапку з комою в попередньому рядку, замість цього може бути оцінено вираз додавання.
Джексон

1
У випадках, коли вони поводяться так само, я з’ясував, що parseFloat повільніше від 1% до 15%, стає повільніше, коли кількість десяткових цифр у рядку збільшується. З 1M запуском у моїй системі parseFloat ('1.501') на 5% повільніше, ніж число ('1.501'), а parseFloat ('1.50137585467') на 15% повільніше, ніж число ('1.50137585467'). Отже, я йду на номер ().
bytepan

1
@ ChrisBrownie55 Нічого собі, хороший улов. Я не знав, що parseFloat може це зробити. Я думаю, нескінченність - це не ціле число!
sstur

9

Різниця полягає в тому, що відбувається, коли вхід не є "належним числом". 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

4
Зауважте, що NaN != NaNхоча
Векс

@Wex Про ви Мента , що має NaN != NaNзначення TRUE , - спасибі за підказку!
jave.web

4
використання isNaN () для тестування значення NaN, isNaN(NaN)повертаєтьсяtrue
jave.web

5

У цих прикладах ви бачите різницю:

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


2

Для порожнього рядка вони різні.

+""і Number("")повертає 0, тоді як parseFloat("")повертає NaN.


2
Я б пішов так далеко, щоб сказати, що parseFloat()має правильний результат, оскільки порожня рядок НЕ число 0(читайте: NaN), а рядок із символом "0"у ньому є 0;
Крістофер

+xповертає 0не тільки порожній рядок, але й будь-які рядки, що містять лише пробіли. Приклади: +" ", +"\t\t\t", +"\n\n"- всі вони дають 0в результаті
Лукаш Wiktor

2

Наскільки я знаю, і це лише підслуховується від колег, так що, можливо, було б погано поінформовано, що parseFloat є незначно швидшим.

Хоча при подальшому дослідженні, здається, що ця різниця в продуктивності залежить від браузера.

http://jsperf.com/parseint-vs-parsefloat/6

Подивіться на ці результати jsPerf і змусьте вас телефонувати. (вона також включає + x тести)

Як зазначається у відповіді @xdazz, +""і Number("")повертайтеся, 0поки parseFloat("")повертається NaNтак. Знову я б пішов з parseFloat, оскільки порожня рядок НЕ означає число 0, лише рядок із символом "0"у ньому означає 0;


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