parseInt()とNumber()の違いは何ですか?


回答:


456

まあ、それはある意味的に異なるNumber関数と呼ばれるコンストラクタを行う型変換parseIntを行い解析し、例えば:

// parsing:
parseInt("20px");       // 20
parseInt("10100", 2);   // 20
parseInt("2e1");        // 2

// type conversion
Number("20px");       // NaN
Number("2e1");        // 20, exponential notation

場合ことを覚えておいてくださいparseInt文字列の検出先行ゼロが、それは進ベースに数値を解析することがあります、これはECMAScriptの5、標準の新バージョンに変更されているが、それは(ブラウザの実装に取得するには長い時間がかかりますECMAScript 3)との非互換性もparseInt、現在使用されているベースの数字に対応しない末尾の文字を無視します。

Numberコンストラクタは、オクタルを検出しません。

Number("010");         // 10
parseInt("010");       // 8, implicit octal
parseInt("010", 10);   // 10, decimal radix used

ただし、次のように、16進表記で数値を処理できますparseInt

Number("0xF");   // 15
parseInt("0xF"); //15

さらに、数値型変換を実行するために広く使用されている構造は、単項+演算子(p。72)です。これは、Numberコンストラクターを関数として使用することと同じです。

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10

興味深いことに、parseIntは数値の後に続く文字を無視しますか?私の場合、変換時に20ではなくNaNを取得したいので。
マーク

はい、そうです。あなたは間違いなくNumber()を望んでいるように聞こえます
Gareth

さて、私はNumber()で行くと思いますが、この点とこれらのすべての例をクリアしてくれてありがとう!:-)
マーク

1
これありがとう。NaNを目にしたのはこれが初めてです。NaNが関数isNaN(value)でテストされていることを知っている人もいるでしょう。たとえば、「if(value == NaN)」を使用するだけでは機能しません。
WonderfulDay

1
Number()16進数や2進数と同様に8進数を扱います:Number('0o10') == 8
Juan Mendes

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

最初の2つはオブジェクトではなくプリミティブを返すため、パフォーマンスが向上します。


20
new Number()とは異なりNumber()ます。typeof Number("123") => number
Gareth

8
またnew Number("1") != new Number("1")絶対に使用しないでくださいnew Number。決して決して決して決して。Number("1")一方、は完全に妥当です。
Kragen Javier Sitaker

18
@Kragen、「never」を5回入力するだけでなく、「new Number」を使用してはならない理由を説明すると、コミュニティにとってより有益になります...
ken

1
@ken非常に古いコメントですが、将来のビジターにとっては、彼らが最初に言及した理由がまさにそのためだと思います。私は2つの数値を解析しlet x = new Number("2"); let y = new Number("2");、その後、何らかの理由で等価性チェックを実行します。if (x == y) { doSomething(); }論理的doSomethingに呼び出す必要があります。しかし、それはしません。あなたが唯一の数を解析した場合もlet x = new Number("2");、その後x === 2はfalseになります。これが、使用してはいけない明確な理由ですnew Number
Tom C

1
@TomC編集されたコメントの結果が表示されます(コメントに続く鉛筆アイコンが意味するものです)。以前は説明はありませんでした。

15

パフォーマンスを求めている場合、おそらく最良の結果はビット単位の右シフトで得られます"10">>0。また、乗算("10" * 1)またはしない(~~"10")。それらのすべては、はるかに高速のですNumberparseInt。それらは、数引数ではなく0を返す「機能」さえ持っています。こちらがパフォーマンステストです。


1
さまざまなアプローチの速度は、時間の経過とともにブラウザのリビジョンによって変化するようです。リンクされたテストも変更され、このコメントの最新バージョンはjsperf.com/number-vs-parseint-vs-plus/39です -幸い、サイトには以前のバージョンのテストも含まれています
bobo

@ボボ、確かに。-好奇心から、クロムで確認Numberし、parseInt残りの部分よりも、まだ遅く99%。それに加えて、視覚的にも魅力的ではありません:-)
Saulius、2014

15
「役に立たない」最適化よりも常にコードの明快さを優先してください。ほとんどのユースケースで、parseIntまたはNumberより望ましい。1秒あたり数百万回の変換を行うN64エミュレーターをプログラミングしている場合は、それらのトリックを検討することができます。
ngryman、2015年

1
質問は行動に関するものであり、パフォーマンスの議論はトピック外です。
空気圧

1
これは、大きな整数、特に符号付き32ビット整数に適合しない整数には使用できないことに注意してください。JavaScriptでは、ビットごとの演算子はオペランドを10進数ではなく32ビットのシーケンスとして扱います。 16進数、または8進数。したがって、(2**31).toString() >> 0オーバーフローし-2147483648ます。の>>>代わりに>>を使用して、JavaScriptでオペランドを符号なし 32ビット整数として処理することができますが、それよりも大きい数値2**32 - 1もオーバーフローします。
hasc


6

一つのマイナーな差は、彼らがで変換するものですundefinednull

Number() Or Number(null) // returns 0

ながら

parseInt() Or parseInt(null) // returns NaN

6

概要:

parseInt()

  • 文字列を最初の引数、基数(数値システムの基となる整数、たとえば10進数の10や2進数の2)を2番目の引数として受け取ります
  • 最初の文字を数値に変換できない場合、関数は整数を返しますNaN
  • parseInt()関数が非数値に遭遇した場合、残りの入力文字列を切り取り、非数値になるまで部分のみを解析します。
  • 基数がundefined0の場合、JSは次のことを想定します。
    • 入力文字列が「0x」または「0X」で始まる場合、基数は16(16進数)で、残りの文字列は数値に解析されます。
    • 入力値が0で始まる場合、基数は8(8進数)または10(10進数)のいずれかになります。選択される基数は、JSエンジンの実装によって異なります。ES5その場合は10を使用する必要があることを指定します。ただし、これはすべてのブラウザでサポートされているわけではないため、数値が0で始まる場合は常に基数を指定してください。
    • 入力値が任意の数字で始まる場合、基数は10になります

Number()

  • Number()コンストラクタは数に任意の引数の入力を変換することができます。Number()コンストラクタが入力を数値に変換できない場合は、NaNが返されます。
  • Number()コンストラクタはまた、16進数を扱うことができ、彼らがして起動する必要があります0x

例:

console.log(parseInt('0xF', 16));  // 15

// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));

// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10));  // 10

// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));


console.log('\n');


// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));

// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));

// scientific notation is allowed
console.log(Number('152e-1'));  // 15.21


5

私は常にparseIntを使用していますが、8進モードに強制する先行ゼロには注意してください。


35
parseInt(value, radix)偶発的な8進数モードの変換などがないように、基数をそのように指定することは常に良いアイデアだと思います
awesomo

ECMAScript 3では、先頭のゼロ強制的に8進モードになります。ECMAScript5は0、厳密でないモードであっても、それをに解析します。しかし、これは修正され、先行ゼロは単に無視されるので、parseInt("070")になり70ます。
Piotrek Hryciuk 2016

2
基数の値をに指定するように警告するリンターも使用する必要がありますparseInt()
ジャスティン

2

parseInt() ->数値を指定されたredixに解析します。

Number()->失敗した場合は、指定された値を対応する数値またはNaNに変換します。

したがって、数値以外の値を数値に変換するには、常にNumber()関数を使用する必要があります。

例えば。

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

parseInt()関数はredix変換を行うため、さまざまなコーナーケースがあります。そのため、変換目的でparseInt()関数を使用することは避けてください。

ここで、提供された値が数値かどうかを確認するには、ネイティブisNaN()関数を使用する必要があります



1

16進数または8進数が必要でない限り、parseIntを避け、NumberおよびMath.roundを使用することをお勧めします。どちらも文字列を使用できます。なぜそれから離れるのですか?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

それは完全に肉屋を本当に大きいか本当に小さい数で殺します。奇妙なことに、これらの入力が文字列であれば、正常に動作します。

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

これと他の人々が言及した他の落とし穴でバグを見つけるのが難しいリスクを負う代わりに、base 10以外のものを解析する必要がない限り、parseIntは避けます。Number、Math.round、Math.foor、および.toFixed(0)はすべてこれらのタイプのバグがなくても、parseIntを使用できるのと同じことを行います。

parseIntを他の品質に本当に使用したい、または使用する必要がある場合は、floatIntをintに変換するために使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.