数字を文字列に変換する「最善の」方法は何ですか(速度の利点、明確さの利点、メモリの利点などの点で)。
いくつかの例:
String(n)
n.toString()
""+n
n+""
このような:
var foo = 45;
var bar = '' + foo;
実際には、私は単純な利便性のためにこれを好むのが普通ですが、何千回もの繰り返しがあるように見えます生の速度では_ .toString()
には利点があります。
ここでパフォーマンステストを参照してください(私ではなく、私が自分で書いたときに見つかりました): http://jsben.ch/#/ghQYR
上記のJSPerfテストに基づく最速:str = num.toString();
注意すべきですあなたがそれが0.1秒で100万回変換を行うことができると考えるとき速度の違いがそれほど大きくないことを注意してください。
更新:ブラウザによって速度が大きく異なるようです。 Chromeではnum + ''
がこのテストに基づくと最も速いようです http://jsben.ch/#/ghQYR
更新2:上記の私のテストに基づくと、Firefox 20.0.1は'' + num
サンプルよりも約100倍遅く.toString()
を実行することに注意すべきです。
私の意見では、n.toString()
はその明快さのために賞をとります。
明示的な変換は、その言語に慣れていない人にとっては非常に明確です。他の人が示唆しているように、型強制を使用すると、開発者が強制規則を知らない場合、あいまいさが生じます。最終的に開発者の時間はCPUの時間よりもコストがかかるので、私は後者を犠牲にして前者に最適化したいと思います。そうは言っても、この場合は違いはごくわずかですが、そうでない場合は、この種のことを最適化する適切なJavaScriptコンプレッサがいくつかあると確信しています。
そのため、上記の理由から、n.toString()
またはString(n)
を使います。 n
がnullまたは未定義でも失敗しないため、String(n)
はおそらくより良い選択です。
2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first
.
出典
チークの舌は明らかに:
var harshNum = 108;
"".split.call(harshNum,"").join("");
ES6では、 テンプレート文字列 :を使用することもできます。
var harshNum = 108;
`${harshNum}`;
変数を文字列に変換する最も簡単な方法は、その変数に空の文字列を追加することです。
5.41 + '' // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
フォーマット - 結果を特定の 小数点以下の桁数にする必要がある場合、 例えば通貨を表すために - toFixed()
メソッドのようなものが必要です。
number.toFixed( [digits] )
digits
は、小数点以下に表示する桁数です。
読みやすいので最初の2つが好きです。私はString(n)
を使う傾向がありますが、それは何よりもスタイルの問題です。
それはあなたがのような行を持っていない限りです
var n = 5;
console.log ("the number is: " + n);
これは非常に自明です
状況によりますが、.toString()
メソッドを使用することができます。これは理解しやすいことです。
私は https://jsperf.com を使用して、次のような場合のテストケースを作成しました。
number + ''
`${number}`
String(number)
number.toString()
https://jsperf.com/number-string-conversion-speed-comparison
2018年7月24日の時点で、結果はnumber + ''
がChromeで最も速い、Firefoxでテンプレート文字列リテラルと結びついていると言います。
String(number)
とnumber.toString()
はどちらも最速のオプションよりも約95%遅くなります。
私がすべてを考慮に入れなければならなかったならば、私は以下を提案します
var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''
私見、文字列に変換するためのその最速の方法。間違っていれば訂正してください。
唯一ほぼすべて可能な既存および将来のケース(入力は数値、null、未定義、シンボル、その他)の有効な解決法はString(x)
です。 "ここで私は確実に数値を文字列に変換し、ここで確実に文字列をブール値にする"のような、値型の仮定に基づく単純な操作に3つの方法を使用しないでください。
説明:
String(x)
はnull、未定義、Symbolsなどを処理し、オブジェクトに対して.toString()
を呼び出します。
'' + x
はxで.valueOf()
を呼び出し(数値へのキャスト)、Symbolsをスローし、実装依存の結果を提供します。
x.toString()
はnullと未定義をスローします。
注:String(x)
のようなプロトタイプのないオブジェクトでは、Object.create(null)
は失敗します。
'Hello、undefined'のような文字列が気に入らない場合、またはプロトタイプのないオブジェクトをサポートしたい場合は、次の型変換関数を使用してください。
/**
* Safely casts any value to string. Null and undefined are converted to ''.
* @param {*} value
* @return {string}
*/
function string (str) {
return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}
.toString()は組み込み型キャスト関数です、私はその詳細に精通していませんが、組み込み型キャストと明示的な方法論を比較するときはいつでも組み込みの回避策が常に好まれます。
どれが最もパフォーマンスが高いかについて興味があるなら、これをチェックしてください。ここで私はすべての異なるNumber - > String変換を比較します。
2+''
または2+""
が最速です。
Node.jsを使用した場合も同様の結果になります。私はこのスクリプトを実行しました:
let bar;
let foo = ["45","foo"];
console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
bar = "" + foo;
}
console.timeEnd('string concat testing');
console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
bar = String(foo);
}
console.timeEnd("string obj testing");
console.time("string both");
for (let i = 0; i < 10000000; i++) {
bar = "" + foo + "";
}
console.timeEnd("string both");
そして、次のような結果が得られました。
❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms
私はそれを実行するたびに同様の回数。
メソッドtoFixed()
も目的を解決します。
var n = 8.434332;
n.toFixed(2) // 8.43
Number
オブジェクトを呼び出してからtoString()
を呼び出すことができます。
Number.call(null, n).toString()
このトリックを他のJavascriptネイティブオブジェクトに使用することができます。
時間があるときに、これをより多くのデータで再編集します。今のところ、これで問題ありません。
nodejs v8.11.2:2018/06/06のテスト
let i=0;
console.time("test1")
for(;i<10000000;i=i+1){
const string = "" + 1234;
}
console.timeEnd("test1")
i=0;
console.time("test1.1")
for(;i<10000000;i=i+1){
const string = '' + 1234;
}
console.timeEnd("test1.1")
i=0;
console.time("test1.2")
for(;i<10000000;i=i+1){
const string = `` + 1234;
}
console.timeEnd("test1.2")
i=0;
console.time("test1.3")
for(;i<10000000;i=i+1){
const string = 1234 + '';
}
console.timeEnd("test1.3")
i=0;
console.time("test2")
for(;i<10000000;i=i+1){
const string = (1234).toString();
}
console.timeEnd("test2")
i=0;
console.time("test3")
for(;i<10000000;i=i+1){
const string = String(1234);
}
console.timeEnd("test3")
i=0;
console.time("test4")
for(;i<10000000;i=i+1){
const string = `${1234}`;
}
console.timeEnd("test4")
i=0;
console.time("test5")
for(;i<10000000;i=i+1){
const string = 1234..toString();
}
console.timeEnd("test5")
i=0;
console.time("test6")
for(;i<10000000;i=i+1){
const string = 1234 .toString();
}
console.timeEnd("test6")
出力
test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms
最近これに遭遇すると、方法3と方法4は、文字列がどのようにコピーされてまとめられるかという理由で適切ではありません。小さなプログラムではこの問題は重要ではありませんが、実際のWebアプリケーションでは、頻度文字列の操作に対処する必要があるこの動作は、パフォーマンスと読みやすさに影響を与える可能性があります。