web-dev-qa-db-ja.com

JavaScriptで数値を文字列に変換する最善の方法は何ですか?

数字を文字列に変換する「最善の」方法は何ですか(速度の利点、明確さの利点、メモリの利点などの点で)。

いくつかの例:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

430
Pacerier

このような:

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()を実行することに注意すべきです。

439
scunliffe

私の意見では、n.toString()はその明快さのために賞をとります。

316
CarlosZ

明示的な変換は、その言語に慣れていない人にとっては非常に明確です。他の人が示唆しているように、型強制を使用すると、開発者が強制規則を知らない場合、あいまいさが生じます。最終的に開発者の時間はCPUの時間よりもコストがかかるので、私は後者を犠牲にして前者に最適化したいと思います。そうは言っても、この場合は違いはごくわずかですが、そうでない場合は、この種のことを最適化する適切なJavaScriptコンプレッサがいくつかあると確信しています。

そのため、上記の理由から、n.toString()またはString(n)を使います。 nがnullまたは未定義でも失敗しないため、String(n)はおそらくより良い選択です。

59
Bryan Kyle

2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first .

出典

22
Mohammad Arif

チークの舌は明らかに:

var harshNum = 108;
"".split.call(harshNum,"").join("");

ES6では、 テンプレート文字列 :を使用することもできます。

var harshNum = 108;
`${harshNum}`;
14
cssimsek

変数を文字列に変換する最も簡単な方法は、その変数に空の文字列を追加することです。

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
11
sgokhales

他の答えは他の選択肢をすでにカバーしていました、しかし私はこれを好む:

s = `${n}`

短く、簡潔で、すでに他の多くの場所で使用されている場合(最新のフレームワーク/ ESバージョンを使用している場合)、すべてのプログラマーが理解できるように安全な方法です。

それは(通常)大したことではありませんが、 他のメソッド と比較して 最速 のようにも思えます。

6
johndodo

フォーマット - 結果を特定の 小数点以下の桁数にする必要がある場合、 例えば通貨を表すために - toFixed()メソッドのようなものが必要です。

number.toFixed( [digits] )

digitsは、小数点以下に表示する桁数です。

6
Tim

読みやすいので最初の2つが好きです。私はString(n)を使う傾向がありますが、それは何よりもスタイルの問題です。

それはあなたがのような行を持っていない限りです

var n = 5;
console.log ("the number is: " + n);

これは非常に自明です

2
Aleadam

状況によりますが、.toString()メソッドを使用することができます。これは理解しやすいことです。

2
Serghei

私は 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%遅くなります。

performance tests, description above

2
Erick

私がすべてを考慮に入れなければならなかったならば、私は以下を提案します

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

私見、文字列に変換するためのその最速の方法。間違っていれば訂正してください。

1
Kumar

唯一ほぼすべて可能な既存および将来のケース(入力は数値、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));
}
1

.toString()は組み込み型キャスト関数です、私はその詳細に精通していませんが、組み込み型キャストと明示的な方法論を比較するときはいつでも組み込みの回避策が常に好まれます。

1
Mubeen Khan

String コンストラクタも使用できます。 このベンチマーク によると、Firefox 58でNumberをStringに変換する最も速い方法は、一般的なブラウザであるGoogle Chromeの" + numよりは遅いですが。

0
peter

どれが最もパフォーマンスが高いかについて興味があるなら、これをチェックしてください。ここで私はすべての異なるNumber - > String変換を比較します。

2+''または2+""が最速です。

https://jsperf.com/int-2-string

0
Alex Cory

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

私はそれを実行するたびに同様の回数。

0
Shahaed

メソッドtoFixed()も目的を解決します。

var n = 8.434332;
n.toFixed(2)  // 8.43
0
Shaik Rasool

Numberオブジェクトを呼び出してからtoString()を呼び出すことができます。

Number.call(null, n).toString()

このトリックを他のJavascriptネイティブオブジェクトに使用することができます。

0
ufadiz

時間があるときに、これをより多くのデータで再編集します。今のところ、これで問題ありません。

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
0
DarckBlezzer

最近これに遭遇すると、方法3と方法4は、文字列がどのようにコピーされてまとめられるかという理由で適切ではありません。小さなプログラムではこの問題は重要ではありませんが、実際のWebアプリケーションでは、頻度文字列の操作に対処する必要があるこの動作は、パフォーマンスと読みやすさに影響を与える可能性があります。

ここにリンクがあります

0
roger