任意の数、それは数です。文字列は数字のように見えます、それは数字です。それ以外はすべてNaNになります。
'a' => NaN
'1' => 1
1 => 1
'1a'文字列で何をすべきですか?' 1'1?言い換えれば、なぜそれを行うための最も一般的な方法(Number(x)およびparseInt(x, 10))では不十分なのですか?
任意の数、それは数です。文字列は数字のように見えます、それは数字です。それ以外はすべてNaNになります。
'a' => NaN
'1' => 1
1 => 1
'1a'文字列で何をすべきですか?' 1'1?言い換えれば、なぜそれを行うための最も一般的な方法(Number(x)およびparseInt(x, 10))では不十分なのですか?
回答:
私の知る限り、4つの方法があります。
Number(x);
parseInt(x, 10);
parseFloat(x);
+x;
私が作成したこの簡単なテストでは、実際にはブラウザーに依存しています。
http://jsperf.com/best-of-string-to-number-conversion/2
Implicit は3つのブラウザーで最速とマークされていますが、コードが読みにくくなっています...だから、好きなように選んでください!
1*、日付から数値への変換に使用します+。これは、上記と同様です。つまり、と1*new Date()いうより+new Date()。おそらくそれはもっと読みやすいですか?
1*エラーが発生しにくいため、好ましいと思います。以前の不要なダングリング変数+1は解析エラーではありません。これは、での使用if (MYCONSTANT == myvar)に似たトリックCです。
整数のみに変換したい場合、もう1つの高速(および短い)方法は、2ビットではない(つまり、2つのチルド文字を使用する)方法です。
例えば
~~x;リファレンス:http : //james.padolsey.com/cool-stuff/double-bitwise-not/
これまでにわかっている、文字列を数値に変換する5つの一般的な方法には、すべて異なる点があります(機能するビット単位の演算子は他にもありますが、すべて同じ結果になります~~)。このJSFiddleは、デバッグコンソールに期待することができます異なる結果を示していますhttp://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"2147483648",
"4999999999"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" ~~x = " + ~~x);
}
123
Number(x) = 123
parseInt(x, 10) = 123
parseFloat(x) = 123
+x = 123
~~x = 123
undefined
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
null
Number(x) = 0
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = 0
~~x = 0
"not a number"
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
123.45
Number(x) = 123.45
parseInt(x, 10) = 123
parseFloat(x) = 123.45
+x = 123.45
~~x = 123
1234 error
Number(x) = NaN
parseInt(x, 10) = 1234
parseFloat(x) = 1234
+x = NaN
~~x = 0
2147483648
Number(x) = 2147483648
parseInt(x, 10) = 2147483648
parseFloat(x) = 2147483648
+x = 2147483648
~~x = -2147483648
4999999999
Number(x) = 4999999999
parseInt(x, 10) = 4999999999
parseFloat(x) = 4999999999
+x = 4999999999
~~x = 705032703
~~xバージョン他の人が、多くの場合につながる「より」の場合、内数で結果undefinedが、それは(それが返されます例えば、無効な入力のために失敗し0た文字列が非数値文字が含まれている場合、後に有効な番号)。
注意:で整数オーバーフローまたはビット切り捨てが発生する可能性があります~~が、他の変換では発生しません。このような大きな値を入力することは珍しいことですが、これに注意する必要があります。より大きな値を含むように例を更新しました。
一部のPerfテストでは、標準parseIntとparseFloat関数が実際には最速のオプションであり、おそらくブラウザーによって高度に最適化されていることが示されていますが、すべてのオプションは十分に高速であるため、すべて要件に依存します:http : //jsperf.com/best-of-string-to -数値変換/ 37
これはすべて、一部のparseInt / parseFloatがはるかに遅いことを示すように、perfテストがどのように構成されているかに依存します。
~~4294967296はを返します0。
文字列を整数に変換する高速な方法は、ビットごと、または次のように使用することです。
x | 0
それは実装方法に依存しますが、理論的+xには、最初にx数値にキャストしてから非常に効率的なorを実行するため、比較的高速(少なくともと同じくらい高速)である必要があります。
これを行う簡単な方法を次に 示します。var num = Number(str); この例では、strは文字列を含む変数です。テストして、それがどのように機能するかを確認することができます:Google Chrome開発者ツール、次にコンソールに移動して次のコードを貼り付けます。コメントを読んで、変換がどのように行われるかをよく理解してください。
// Here Im creating my variable as a string
var str = "258";
// here im printing the string variable: str
console.log ( str );
// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);
// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);
これはおそらくそれほど速くはありませんが、数値が少なくとも特定の値(例:0)、または多くても特定の値であることを確認できるという追加の利点があります。
Math.max(input, 0);
最小値を確認する必要がある場合は、通常、
var number = Number(input);
if (number < 0) number = 0;
Math.max(..., 0) 2つのステートメントを書く手間を省きます。
Math.abs(input)ですか?また、文字列を正の数に変換し、いくつかの余分な文字を節約します。
input数に変換できない場合は、次のようになりますNaN
正式にリリースされたばかりの測定およびデータ型変換ライブラリであるUnitOfをお試しください。UnitOfは非常に高速で、サイズが小さく、エラーやnull /未定義をスローすることなくあらゆるデータ型を変換するのに効率的です。定義したデフォルト値またはUnitOfのデフォルトは、変換が失敗したときに返されます。
//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.
//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.