回答:
このような:
var foo = 45;
var bar = '' + foo;
実際、私は通常、単純な便宜のためにこのようにしていますが、 1,000回を超える反復は生の速度で表示され、.toString()
ここでは、パフォーマンステストを参照してください(自分ではありませんが、自分で作成したときに見つかりました):http : //jsben.ch/#/ghQYR
上記のJSPerfテストに基づく最速: str = num.toString();
0.1秒で100万回変換できると考えると、速度の違いはそれほど大きくないことに注意してください。
更新:速度はブラウザによって大きく異なるようです。Chromeではnum + ''
、このテストに基づいて最も高速であるようですhttp://jsben.ch/#/ghQYR
アップデート2:上記の私のテストに基づいて、Firefox 20.0.1の実行.toString()
は'' + num
サンプルよりも約100倍遅いことに注意してください。
null foo
はエラーをスローしないので、私はこの答えが好きです。
私の意見でn.toString()
は、その明快さのために賞をとっています、そしてそれが余分なオーバーヘッドを運ぶとは思いません。
null
などundefined
)を提供しても、「安全」ではありません。
null
かundefined
、それはアプリケーションの特定があるとして、私が想像しながら、(n || defaultNumber).toString()
ほとんどの人が、私は強く、我々はすべての質問にそれを作業する必要があります同意しないような状況にしたいと思うものです。これは、数値を文字列に変換すること、優れたアーキテクチャ、および必要に応じて他の型変換を別のレッスンで行うことでした。
明示的な変換は、その言語を初めて使用するユーザーにとって非常に明確です。他の人が示唆しているように、型強制を使用すると、開発者が強制ルールを認識していない場合にあいまいさが生じます。結局のところ、開発者の時間はCPU時間よりもコストがかかるので、後者を犠牲にして前者を最適化します。そうは言っても、この場合、違いはごくわずかですが、そうでない場合でも、この種のことを最適化する適切なJavaScriptコンプレッサーがいくつかあると私は確信しています。
だから、上記の理由で私は行くでしょう:n.toString()
またはString(n)
。 String(n)
はn
nullまたは未定義の場合に失敗しないため、おそらくより良い選択です。
null
、またはundefined
。プログラムのバグである場合n
、null
またはundefined
プログラムのバグが原因である場合、バグを見つけて修正する可能性を高めるために、プログラムがこの状態で失敗することを望みます。プログラムのクラッシュは、プログラマがバグを見つけやすくするための贈り物です:-)。代替策は、バグを注意深く見極めた上で、設計どおりに機能しないソフトウェアを提供することです。したがって、私はString(n)
エラーをマスクするために使用するのが好きではありません。
String(n)
たとえば、アンダースコアの結合など、機能的なスタイルで使用するのに適してい_.compose(funcThatNeedsAStringParam, String)
ます。
舌の頬は明らかに:
var harshNum = 108;
"".split.call(harshNum,"").join("");
または、ES6でテンプレート文字列を使用することもできます。
var harshNum = 108;
`${harshNum}`;
'' + number
メソッドよりも高速であることが判明する場合もあります。つまり、これらのベンチマークの結果は、複数回実行すると大きく異なるため、あまりに深刻に受け止めるべきかどうかはわかりません。
他の回答はすでに他のオプションをカバーしていますが、私はこれを好みます:
s = `${n}`
短く、簡潔で、他の多くの場所ですでに使用されている(最新のフレームワーク/ ESバージョンを使用している場合)ので、プログラマーなら誰でも理解できるはずです。
n.toString()
ありませんか?
n
あるundefined
、それは使用して構文エラーがスローされます.toString()
String(n)
はすべての場合と同じ結果を与えるだけではないですか?唯一の違いは、あまり明確ではないということです。
変数を文字列に変換する最も簡単な方法は、その変数に空の文字列を追加することです。
5.41 + '' // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
(5.41 + '')
文字列のようなメソッドを使用する.substring()
と、他の人を
通貨を表すなど、結果を特定の小数点以下の桁数にフォーマットする必要がある場合は、メソッドのようなものが必要です。toFixed()
number.toFixed( [digits] )
digits
小数点以下の桁数です。
https://jsperf.comを使用して、以下のケースのテストケースを作成しました。
number + ''
`${number}`
String(number)
number.toString()
https://jsperf.com/number-string-conversion-speed-comparison
2018年7月24日の時点で、結果number + ''
は、テンプレート文字列リテラルと連携するFirefoxのChromeの中で最速であるとしています。
両方String(number)
、およびnumber.toString()
最速オプションよりも約95%遅いです。
考えられるほとんどすべての既存および将来のケース(入力は数値、null、未定義、シンボルなど)に対する唯一の有効なソリューションは、String(x)
です。「ここでは数値を文字列に確実に変換し、ここではブール値を文字列に確実に変換する」のように、値型の仮定に基づいて、3つの方法で単純な操作を行わないでください。
説明:
String(x)
null、undefined、Symbols、[anything]を処理し.toString()
、オブジェクトを呼び出します。
'' + x
.valueOf()
x(数値へのキャスト)の呼び出し、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));
}
どちらが最もパフォーマンスが良いかについて知りたい場合は、ここをチェックして、さまざまな数値->文字列変換をすべて比較してください。
のように見える2+''
か2+""
、最速です。
メソッドtoFixed()
も目的を解決します。
var n = 8.434332;
n.toFixed(2) // 8.43
時間があれば、これをより多くのデータで再編集します。現時点ではこれで問題ありません...
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
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
実行するたびに同じような時間。
'' + 123e-50
が返されない場合があります"1.23e-48"
。