文字列を数値に変換する場合parseInt()
、どのようにしてNumber()
異なる動作をしますか?
文字列を数値に変換する場合parseInt()
、どのようにしてNumber()
異なる動作をしますか?
回答:
まあ、それはある意味的に異なる、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
Number()
16進数や2進数と同様に8進数を扱います:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
最初の2つはオブジェクトではなくプリミティブを返すため、パフォーマンスが向上します。
new Number()
とは異なりNumber()
ます。typeof Number("123") => number
new Number("1") != new Number("1")
。絶対に使用しないでくださいnew Number
。決して決して決して決して。Number("1")
一方、は完全に妥当です。
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
パフォーマンスを求めている場合、おそらく最良の結果はビット単位の右シフトで得られます"10">>0
。また、乗算("10" * 1
)またはしない(~~"10"
)。それらのすべては、はるかに高速のですNumber
とparseInt
。それらは、数引数ではなく0を返す「機能」さえ持っています。こちらがパフォーマンステストです。
Number
し、parseInt
残りの部分よりも、まだ遅く99%。それに加えて、視覚的にも魅力的ではありません:-)
parseInt
またはNumber
より望ましい。1秒あたり数百万回の変換を行うN64エミュレーターをプログラミングしている場合は、それらのトリックを検討することができます。
(2**31).toString() >> 0
オーバーフローし-2147483648
ます。の>>>
代わりに>>
を使用して、JavaScriptでオペランドを符号なし 32ビット整数として処理することができますが、それよりも大きい数値2**32 - 1
もオーバーフローします。
に変換string
するいくつかの方法の中で、パフォーマンスの2つのリンクを比較しましたint
。
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を使用していますが、8進モードに強制する先行ゼロには注意してください。
parseInt(value, radix)
偶発的な8進数モードの変換などがないように、基数をそのように指定することは常に良いアイデアだと思います
0
、厳密でないモードであっても、それをに解析します。しかし、これは修正され、先行ゼロは単に無視されるので、parseInt("070")
になり70
ます。
parseInt()
。
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()
関数を使用する必要があります
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
これと他の人々が言及した他の落とし穴でバグを見つけるのが難しいリスクを負う代わりに、base 10以外のものを解析する必要がない限り、parseIntは避けます。Number、Math.round、Math.foor、および.toFixed(0)はすべてこれらのタイプのバグがなくても、parseIntを使用できるのと同じことを行います。
parseIntを他の品質に本当に使用したい、または使用する必要がある場合は、floatIntをintに変換するために使用しないでください。