Что лучше: число (x) или parseFloat (x)?

147

Что лучше?

Я спрашиваю это только ради бритья нескольких байтов, поскольку я могу использовать + x вместо числа (x). Parsefloat делает что-то лучше?

Наманяй Гоэль
источник
2
Числа с плавающей запятой одинарной точности занимают 4 байта в 32-битной системе, а также простые целые числа. Я не знаю, как javascript обрабатывает плавающие объекты, но я думаю, что это почти то же самое.
Кристиан
5
@Christian: Все числа в Javascript являются числами с двойной точностью.
Guffa
1
Я бы проголосовал за этот вопрос, если бы не сегмент EDIT
LaPuyaLoca

Ответы:

309

Разница между parseFloat и числом

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
Я бы не рассматривал whitespace => 0Number() как «странное» поведение, я бы даже считал его более ожидаемым, пробел - пустое значение, но оно не равно null / undefined => 0 - хороший результат. Большой (+) для вас для витрин в любом случае :)
jave.web
4
@NathanWall: Могу упомянуть об этом, Number('Infinity') === Infinityтогда какparseInt('Infinity') === NaN
sstur
3
Я бы не использовал +(унарный плюс) для этого, потому что если вы забудете точку с запятой в предыдущей строке, вместо этого может быть использовано выражение сложения.
Джексон,
1
Для случаев, которые они ведут себя одинаково, я обнаружил, что parseFloat от 1% до 15% медленнее, становясь медленнее, когда число десятичных цифр в строке увеличивается. При запуске 1M в моей системе parseFloat ('1.501') на 5% медленнее, чем Number ('1.501'), а parseFloat ('1.50137585467') на 15% медленнее, чем Number ('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
@ Wex О, ты NaN != NaNоцениваешь как ИСТИНА - спасибо за совет!
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.

micnic
источник
2

Для пустой строки они разные.

+"" и Number("") возвращает 0, а parseFloat("")возвращает NaN.

xdazz
источник
2
Я бы пошел так далеко, что сказал бы, что parseFloat()имеет правильный результат, так как пустая строка НЕ ​​является числом 0(читай: NaN), в то время как строка с символом "0"в нем IS 0;
Кристофер
+xвозвращает 0не только для пустой строки, но и для любых строк только для пробелов. Примеры: +" ", +"\t\t\t", +"\n\n"- все они дают 0в результате
Лукаш Wiktor
2

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

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

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

Посмотрите на эти результаты jsPerf и сделайте ваш звонок. (включая + x тестов)

Как отмечается в ответе @xdazz, +""и Number("")возвращать 0while parseFloat("")возвращает, NaNпоэтому снова я бы пошел с parseFloat, потому что пустая строка НЕ ​​означает число 0, только строка с символом "0"в нем означает 0;

Кристофер
источник
Вот более исчерпывающая тестовая рыбалка для более быстрого способа конвертации ... parseFloat()все же победитель.
mindplay.dk