30

JavaScript の parseInt(string) と Number(string) の違いは何ですか?以前に尋ねられました。

しかし、答えは基本的に、 のような文字列をに変換radixする能力に焦点を当てていました。parseInt"123htg"123

Number(...)ここで私が求めているのは、 の戻り値と基数のない実際の数値文字列parseFloat(...)を渡すときに大きな違いがあるかどうかです。

4

5 に答える 5

36

@James Allardicがすでに回答しているように、内部の仕組みはそれほど違いはありません。しかし、違いがあります。を使用するparseFloatと、1 つ以上の数字で始まり、その後に英数字が続く (トリミングされた) 文字列を数値に変換できますが、Numberこれは成功しません。次のように:

parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN

ちなみに、どちらの変換でも、入力文字列はトリミングされます。

parseFloat('  3.23abc '); //=> 3.23
Number('   3.23 '); //=> 3.23
于 2012-08-16T13:55:09.263 に答える
26

いいえ。どちらも内部ToNumber(string)関数が呼び出されます。

ES5 セクション 15.7.1 (関数として呼び出される数値コンストラクター)から:

Numberコンストラクターとしてではなく関数として呼び出されると、型変換が実行されます...

ToNumber(value)value が指定された場合はによって計算された Number 値 ( Number オブジェクトではない) を返し、それ以外の場合は を返します+0

ES5 セクション 15.1.2.3 (parseFloat (文字列))から:

... どちらtrimmedStringのプレフィックスもtrimmedStringa の構文を満たさない場合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、コンストラクターになります。新しく作成されたオブジェクトを初期化します。

于 2012-08-16T13:48:06.253 に答える
0

文字列に数字しかないと確信している限り、大きな違いはありません。ある場合は、Numberを返しNaNます。
コンストラクターを使用して発生する可能性のある別の問題Numberは、同僚がnewキーワードを忘れたと思い、後で追加して、厳密な比較が失敗する可能性があることですnew Number(123) === 123--> false に対してNumber(123) === 123--> true.

一般に、私はコンストラクターをそのままにしておくことを好み、 int/float:にキャストNumberするための最短の構文を使用するか、.+numStringparse*

于 2012-08-16T13:52:56.033 に答える
-1

new数値のラッパーオブジェクトの作成に使用しない場合はNumber、文字列から数値への型変換を行うだけに追いやられます。

一方、「parseFloat」は、前述のように、数字、小数、または+/-で始まる任意の文字列から浮動小数点数を解析できます。

したがって、数値のみを含む文字列のみを操作している場合、同じ値になりNumber(x)ますparseFloat(x)

于 2012-08-16T13:51:17.753 に答える
-2

さらに別の回答を投稿してすみませんが、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

注目すべき要点:

  1. 数値に変換する前に if(val) で保護すると、 parseFloat() は空白の場合を除いて数値を返します。
  2. Number は、空白以外の数字以外の文字を除いて、すべての場合に数値を返します。

不足している可能性のあるテスト ケースがあれば、お気軽に追加してください。

于 2015-03-24T19:27:08.500 に答える