web-dev-qa-db-ja.com

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

文字列を数値に変換するときに parseInt()Number() が異なる動作をする方法

284
Mark

さて、それらは意味的に異なりますNumberコンストラクターは関数として呼び出されますタイプを実行しますconversionおよび parseInt は、parseを実行します。例:

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

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

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

Numberコンストラクターは8進数を検出しません。

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

ただし、parseIntと同様に、16進表記の数値を処理できます。

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

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

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10
401
CMS
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

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

20
letronje

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

15
Saulius

stringintに変換するいくつかの方法の間で、パフォーマンスの2つのリンクを比較しました。

parseInt(str,10)    
parseFloat(str)
str << 0
+str
str*1 
str-0
Number(str)

http://jsben.ch/#/zGJHM

http://phrogz.net/js/string_to_number.html

8
zangw

概要:

parseInt()

  • 文字列を最初の引数として、基数(10進数10または2進数2などの数値システムのベースとなる整数)を2番目の引数として受け取ります
  • 最初の文字を数値に変換できない場合、関数は整数を返します。NaNが返されます。
  • parseInt()関数で数値以外の値が検出されると、残りの入力文字列が切り捨てられ、数値以外の値になるまで部分のみが解析されます。
  • 基数がundefinedまたは0の場合、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を使用しますが、強制的にoctalモードになる先行ゼロに注意してください。

1つの小さな違いは、undefinedまたはnullの変換対象です。

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

ながら

parseInt() Or parseInt(null) // returns NaN
4
Naeem Shaikh

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

__ixparseInt()関数にはredix変換を行うため、さまざまなコーナーケースがあります。したがって、強制目的でparseInt()関数を使用することは避けてください。天気を確認するには、指定された値が数値であるかどうかを確認するために、nativeisNaN()関数を使用する必要があります

1
Atishay Baid

parseIntは整数に変換します。つまり、小数を取り除きます。数値は整数に変換されません。

1
Johan Rylander

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

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

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

0
kagronick