文字列を数値に変換するときに parseInt()
と Number()
が異なる動作をする方法
さて、それらは意味的に異なります、 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
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
最初の2つは、オブジェクトではなくプリミティブを返すため、パフォーマンスが向上します。
パフォーマンスを探している場合は、おそらくビット単位の右シフト"10">>0
で最高の結果が得られます。また、乗算("10" * 1
)しない(~~"10"
)。それらはすべてNumber
とparseInt
の方がはるかに高速です。数値ではない引数に対して0を返す「機能」もあります。 パフォーマンステスト です。
string
をint
に変換するいくつかの方法の間で、パフォーマンスの2つのリンクを比較しました。
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt()
:
NaN
が返されます。parseInt()
関数で数値以外の値が検出されると、残りの入力文字列が切り捨てられ、数値以外の値になるまで部分のみが解析されます。undefined
または0の場合、JSは次を想定します。ES5
は、10を使用することを指定します。ただし、これはすべてのブラウザーでサポートされているわけではありませんしたがって、数字が0で始まる場合は常に基数を指定します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
私は常にparseIntを使用しますが、強制的にoctalモードになる先行ゼロに注意してください。
1つの小さな違いは、undefined
またはnull
の変換対象です。
Number() Or Number(null) // returns 0
ながら
parseInt() Or parseInt(null) // returns NaN
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()
関数を使用する必要があります
parseIntは整数に変換します。つまり、小数を取り除きます。数値は整数に変換されません。
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に変換するために使用しないでください。