JavaScript の parseInt(string) と Number(string) の違いは何ですか?以前に尋ねられました。
しかし、答えは基本的に、 のような文字列をに変換radix
する能力に焦点を当てていました。parseInt
"123htg"
123
Number(...)
ここで私が求めているのは、 の戻り値と基数のない実際の数値文字列parseFloat(...)
を渡すときに大きな違いがあるかどうかです。
JavaScript の parseInt(string) と Number(string) の違いは何ですか?以前に尋ねられました。
しかし、答えは基本的に、 のような文字列をに変換radix
する能力に焦点を当てていました。parseInt
"123htg"
123
Number(...)
ここで私が求めているのは、 の戻り値と基数のない実際の数値文字列parseFloat(...)
を渡すときに大きな違いがあるかどうかです。
@James Allardicがすでに回答しているように、内部の仕組みはそれほど違いはありません。しかし、違いがあります。を使用するparseFloat
と、1 つ以上の数字で始まり、その後に英数字が続く (トリミングされた) 文字列を数値に変換できますが、Number
これは成功しません。次のように:
parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN
ちなみに、どちらの変換でも、入力文字列はトリミングされます。
parseFloat(' 3.23abc '); //=> 3.23
Number(' 3.23 '); //=> 3.23
いいえ。どちらも内部ToNumber(string)
関数が呼び出されます。
ES5 セクション 15.7.1 (関数として呼び出される数値コンストラクター)から:
Number
コンストラクターとしてではなく関数として呼び出されると、型変換が実行されます...
ToNumber(value)
value が指定された場合はによって計算された Number 値 ( Number オブジェクトではない) を返し、それ以外の場合は を返します+0
。
ES5 セクション 15.1.2.3 (parseFloat (文字列))から:
... どちら
trimmedString
のプレフィックスもtrimmedString
a の構文を満たさない場合StrDecimalLiteral
(9.3.1 を参照) ...
そして9.3.1は「文字列型に適用された ToNumber」というタイトルのセクションで、最初の引用がToNumber(value)
.
更新(コメントを参照)
Number
演算子を使用してコンストラクターを呼び出すと、数値リテラルではなくnew
、オブジェクトのインスタンスが取得されます。Number
例えば:
typeof new Number(10); //object
typeof Number(10); //number
これは、セクション 15.7.2 (数値コンストラクター)で定義されています。
が式
Number
の一部として呼び出されるとnew
、コンストラクターになります。新しく作成されたオブジェクトを初期化します。
文字列に数字しかないと確信している限り、大きな違いはありません。ある場合は、Number
を返しNaN
ます。
コンストラクターを使用して発生する可能性のある別の問題Number
は、同僚がnew
キーワードを忘れたと思い、後で追加して、厳密な比較が失敗する可能性があることですnew Number(123) === 123
--> false に対してNumber(123) === 123
--> true.
一般に、私はコンストラクターをそのままにしておくことを好み、 int/float:にキャストNumber
するための最短の構文を使用するか、.+numString
parse*
new
数値のラッパーオブジェクトの作成に使用しない場合はNumber
、文字列から数値への型変換を行うだけに追いやられます。
一方、「parseFloat」は、前述のように、数字、小数、または+/-で始まる任意の文字列から浮動小数点数を解析できます。
したがって、数値のみを含む文字列のみを操作している場合、同じ値になりNumber(x)
ますparseFloat(x)
さらに別の回答を投稿してすみませんが、Google検索でここにたどり着きましたが、必要な詳細がすべて見つかりませんでした. Node.js で次のコードを実行します。
var vals = ["1", "1.1", "0", "1.1abc", "", " ", null];
for(var i = 0; i < vals.length; i++){
var ifTest = false;
if(vals[i])
{
ifTest = true;
}
console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest);
}
次の出力が得られます。
val=1, Number()=1, parseFloat()=1, if()=true
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true
val=0, Number()=0, parseFloat()=0, if()=true
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true
val=, Number()=0, parseFloat()=NaN, if()=false
val= , Number()=0, parseFloat()=NaN, if()=true
val=null, Number()=0, parseFloat()=NaN, if()=false
注目すべき要点:
不足している可能性のあるテスト ケースがあれば、お気軽に追加してください。