Что лучше?
Я спрашиваю это только ради бритья нескольких байтов, поскольку я могу использовать + 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("")возвращать 0while parseFloat("")возвращает, NaNпоэтому снова я бы пошел с parseFloat, потому что пустая строка НЕ означает число 0, только строка с символом "0"в нем означает 0;
parseFloat()все же победитель.