Что лучше?
Я спрашиваю это только ради бритья нескольких байтов, поскольку я могу использовать + x вместо числа (x). Parsefloat делает что-то лучше?
javascript
optimization
Наманяй Гоэль
источник
источник
Ответы:
Разница между parseFloat и числом
parseFloat
/parseInt
- для разбора строки, аNumber
/+
- для приведения значения к числу. Они ведут себя по-разному. Но сначала давайте посмотрим, где они ведут себя одинаково:Так что, пока у вас есть стандартный числовой ввод, нет никакой разницы. Однако, если ваш ввод начинается с числа, а затем содержит другие символы,
parseFloat
усекает число из строки, аNumber
даетNaN
(не число):Кроме того,
Number
понимает шестнадцатеричный ввод, аparseFloat
не:Но
Number
действует странно с пустыми строками или строками, содержащими только пробел:В целом, я считаю
Number
более разумным, поэтому я почти всегда использую егоNumber
лично (и вы обнаружите, что многие из внутренних функций JavaScript также используютNumber
). Если кто-то печатает,'1x'
я предпочитаю показывать ошибку, а не воспринимать ее так, как будто она напечатала'1'
. Единственный раз, когда я действительно делаю исключение, это когда я конвертирую стиль в число, и в этом случаеparseFloat
это полезно, потому что стили приходят в такой форме'3px'
, и в этом случае я хочу отбросить'px'
часть и просто получить3
, поэтому я нахожуparseFloat
полезным Вот. Но на самом деле, какой из них вы выбираете, зависит от вас, и какие формы ввода вы хотите принять.Обратите внимание, что использование унарного
+
оператора точно так же, как использованиеNumber
в качестве функции:Так что я обычно просто использую
+
для краткости. Пока вы знаете, что он делает, мне легко читать.источник
Number()
как «странное» поведение, я бы даже считал его более ожидаемым, пробел - пустое значение, но оно не равно null / undefined => 0 - хороший результат. Большой (+) для вас для витрин в любом случае :)Number('Infinity') === Infinity
тогда какparseInt('Infinity') === NaN
+
(унарный плюс) для этого, потому что если вы забудете точку с запятой в предыдущей строке, вместо этого может быть использовано выражение сложения.Разница в том, что происходит, когда ввод не является «правильным числом».
Number
возвращаетNaN
приparseFloat
разборе "столько, сколько может". При вызове пустой строкиNumber
возвращается,0
а parseFloat возвращаетсяNaN
.Например:
источник
NaN != NaN
хотяNaN != NaN
оцениваешь как ИСТИНА - спасибо за совет!isNaN(NaN)
возвращаетtrue
В этих примерах вы можете увидеть разницу:
parseFloat немного медленнее, потому что он ищет первое появление числа в строке, в то время как конструктор Number создает новый экземпляр числа из строк, который содержит числовые значения с пробелами или содержит ложные значения.
PS Если вас интересуют некоторые универсальные решения для преобразования типов, вы можете прочитать пост о преобразовании типов в моем блоге: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html.
источник
Для пустой строки они разные.
+""
иNumber("")
возвращает 0, аparseFloat("")
возвращает NaN.источник
parseFloat()
имеет правильный результат, так как пустая строка НЕ является числом0
(читай: NaN), в то время как строка с символом"0"
в нем IS0
;+x
возвращает0
не только для пустой строки, но и для любых строк только для пробелов. Примеры:+" "
,+"\t\t\t"
,+"\n\n"
- все они дают0
в результатеНасколько я знаю, и это только подслушано коллегами, так что может быть плохо информирован, что parseFloat немного быстрее.
Хотя при дальнейшем исследовании может показаться, что эта разница в производительности зависит от браузера.
http://jsperf.com/parseint-vs-parsefloat/6
Посмотрите на эти результаты jsPerf и сделайте ваш звонок. (включая + x тестов)
Как отмечается в ответе @xdazz,
+""
иNumber("")
возвращать0
whileparseFloat("")
возвращает,NaN
поэтому снова я бы пошел с parseFloat, потому что пустая строка НЕ означает число 0, только строка с символом"0"
в нем означает 0;источник
parseFloat()
все же победитель.