number(x)とparseFloat(x)のどちらが良いですか?


147

どちらが良いですか?

number(x)の代わりに+ xを使用できるため、数バイトを削るためにこれを求めています。parsefloatは何か良いことをしますか?


2
単精度の浮動小数点数は、32ビットシステムでは4バイトと、単純な整数を占めます。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

また、Number16進数の入力を理解しますが、次のこと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 /未定義=> 0ではありませんが素敵な結果です。とにかくショーケースのためのあなたのための
大きな

4
@NathanWall:Number('Infinity') === Infinityそれについて言及したいかもしれませんparseInt('Infinity') === NaN
sstur

3
これには+(単項プラス)は使用しません。前の行のセミコロンを忘れた場合、代わりに加算式が評価される可能性があるためです。
ジャクソン

1
それらが同じように動作する場合、parseFloatは1%から15%遅くなり、文字列の10進数の桁数が増えると遅くなることがわかりました。私のシステムで1Mを実行すると、parseFloat( '1.501')はNumber( '1.501')よりも5%遅く、parseFloat( '1.50137585467')はNumber( '1.50137585467')よりも15%遅くなります。だから、私はNumber()に行きます。
バイトパン

1
@ ChrisBrownie55うわー、良いキャッチ。parseFloatがそれを実行できることを知りませんでした。Infinityは整数ではないと思います!
sstur

9

違いは、入力が「適切な数」でない場合に何が起こるかです。「可能な限り」解析NumberするNaN間に戻りますparseFloat。空の文字列に呼び出された場合はNumber戻り0parseFloatはを返しながら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評価はTRUEです -チップをありがとう!
jave.web

4
NaN値をテストするためにisNaN()を使用してisNaN(NaN)戻りますtrue
jave.web

5

これらの例では、違いを確認できます。

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloatは文字列内の数値の最初の出現を検索するので少し遅くなりますが、Numberコンスタクタは、空白を含む数値またはfalse値を含む文字列から新しい数値インスタンスを作成します。

PS普遍的な型変換ソリューションに興味がある場合は、私のブログの型変換に関する投稿を読むことができます。http//justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

空の文字列の場合は異なります。

+""そしてNumber("")0をparseFloat("")返し、NaN を返します。


2
私はそれが言うようにこれまで行くとparseFloat()、空の文字列が数字ではないと正しい結果があります0(読み:NaN)の文字と文字列の間、"0"その中には、IS 0
クリストファー

+x0空の文字列だけでなく、空白のみの文字列も返します。例:+" "+"\t\t\t"+"\n\n"-それらのすべてを与える0結果
ルカシュWiktor第

2

私の知る限り、これは同僚から聞いたことがあるだけなので、まったく知られていないかもしれませんが、parseFloatはわずかに高速です。

さらに調査すると、このパフォーマンスの違いはブラウザによって異なるようです。

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

これらのjsPerfの結果を確認して、電話をかけてください。(+ xテストも含まれます)

@xdazzさんの回答で述べたように、通り+""Number("")返し0ながらparseFloat("")戻りNaN再び私が空の文字列の番号0を意味するものではありませんので、文字と文字列のみ、parseFloatはとなるだろうので、"0"その中には、0を意味します。


これは、より速く変換するためのより徹底的なテストフィッシングです... parseFloat()まだ勝者です。
mindplay.dk 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.