Что лучше?
Я спрашиваю это только ради бритья нескольких байтов, поскольку я могу использовать + x вместо числа (x). Parsefloat делает что-то лучше?
Что лучше?
Я спрашиваю это только ради бритья нескольких байтов, поскольку я могу использовать + x вместо числа (x). 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
Так что я обычно просто использую +
для краткости. Пока вы знаете, что он делает, мне легко читать.
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
оцениваешь как ИСТИНА - спасибо за совет!
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"
в нем IS 0
;
+x
возвращает 0
не только для пустой строки, но и для любых строк только для пробелов. Примеры: +" "
, +"\t\t\t"
, +"\n\n"
- все они дают 0
в результате
Насколько я знаю, и это только подслушано коллегами, так что может быть плохо информирован, что parseFloat немного быстрее.
Хотя при дальнейшем исследовании может показаться, что эта разница в производительности зависит от браузера.
http://jsperf.com/parseint-vs-parsefloat/6
Посмотрите на эти результаты jsPerf и сделайте ваш звонок. (включая + x тестов)
Как отмечается в ответе @xdazz, +""
и Number("")
возвращать 0
while parseFloat("")
возвращает, NaN
поэтому снова я бы пошел с parseFloat, потому что пустая строка НЕ означает число 0, только строка с символом "0"
в нем означает 0;
parseFloat()
все же победитель.