web-dev-qa-db-ja.com

どちらが良いですか、number(x)またはparseFloat(x)?

どちらが良いですか?

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

123
Namanyay Goel

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は文字列から数字を切り捨てますが、NumberNaN(数字ではない)を返します。

parseFloat('1x'); // => 1
Number('1x'); // => NaN

さらに、Numberは16進入力を理解しますが、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'と入力したかのようにエラーを表示するのではなく、エラーを表示することを好みます。本当に例外を作るのは、スタイルを数値に変換するときだけです。その場合、スタイルは'3px'のような形式になるため、parseFloatが役立ちます。 'px'部分を取得し、3を取得するだけなので、ここでparseFloatが役立ちます。しかし、実際にどちらを選択するかはあなた次第であり、どの形式の入力を受け入れるかはあなた次第です。

単項+演算子を使用することは、関数としてNumberを使用することとまったく同じであることに注意してください。

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

だから私は通常+を単に使用します。あなたがそれが何をするかを知っている限り、私はそれが読みやすいと思います。

260
Nathan Wall

違いは、入力が「適切な数」でない場合に起こることです。 NumberNaNを返しますが、parseFloatは「できる限り」解析します。空の文字列で呼び出された場合、Number0を返し、parseFloatはNaNを返します。

例えば:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32
8
Jon

これらの例では、違いがわかります。

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

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

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

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

4
micnic

空の文字列の場合、それらは異なります。

+""およびNumber("")は0を返し、parseFloat("")はNaNを返します。

2
xdazz

私の知る限り、これは同僚から耳にしたことがないため、parseFloatの方がわずかに速いことを完全に知らないかもしれません。

さらなる調査を行っていますが、このパフォーマンスの違いはブラウザに依存しているようです。

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

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

@xdazzの答えで述べたように、+""Number("")0を返しますが、parseFloat("")NaNを返します。空の文字列は数値0を意味するのではなく、文字"0"を含む文字列のみが0を意味します。

2
Christopher