it-swarm.com.de

Was ist der beste Weg, um eine Zahl in JavaScript in einen String umzuwandeln?

Was ist der "beste" Weg, eine Zahl in eine Zeichenkette umzuwandeln (in Bezug auf Geschwindigkeitsvorteil, Klarheitsvorteil, Speichervorteil usw.)?

Einige Beispiele:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

430
Pacerier

so was:

var foo = 45;
var bar = '' + foo;

Eigentlich, obwohl ich es normalerweise aus einfachen Gründen so mache, scheint es bei mehr als 1.000 Iterationen für rohe Geschwindigkeit gibt es einen Vorteil für .toString()

Siehe Leistungstests hier (nicht von mir, aber gefunden, als ich eigene geschrieben habe): http://jsben.ch/#/ghQYR

Am schnellsten basierend auf dem obigen JSPerf-Test: str = num.toString();

Es sollte beachtet werden, dass der Geschwindigkeitsunterschied nicht zu groß ist, wenn man bedenkt, dass er die Konvertierung auf beliebige Weise durchführen kann 1 Million Mal in 0,1 Sekunden.

Update: Die Geschwindigkeit scheint je nach Browser sehr unterschiedlich zu sein. In Chrome scheint num + '' basierend auf diesem Test am schnellsten zu sein http://jsben.ch/#/ghQYR

Update 2: Wiederum basierend auf meinem obigen Test ist zu beachten, dass Firefox 20.0.1 die .toString() etwa 100 Mal langsamer ausführt als das '' + num-Beispiel.

425
scunliffe

Meiner Meinung nach nimmt n.toString() den Preis für seine Klarheit und ich glaube nicht, dass dies zusätzlichen Aufwand verursacht. 

297
CarlosZ

Explizite Konvertierungen sind für jemanden, der in der Sprache neu ist, sehr klar. Die Verwendung von Typ-Nötigung führt, wie andere vorgeschlagen haben, zu Mehrdeutigkeiten, wenn ein Entwickler die Nötigungsregeln nicht kennt. Letztendlich ist die Entwicklungszeit teurer als die CPU-Zeit, also würde ich für die Erstere auf Kosten der Letzteren optimieren. In diesem Fall ist der Unterschied jedoch wahrscheinlich vernachlässigbar, aber wenn nicht, bin ich sicher, dass es ein paar anständige JavaScript-Kompressoren gibt, die diese Art der Optimierung optimieren.

Aus den oben genannten Gründen würde ich mit n.toString() oder String(n) gehen. String(n) ist wahrscheinlich die bessere Wahl, da es nicht fehlschlägt, wenn n null oder undefiniert ist.

57
Bryan Kyle

... Der Parser von JavaScript versucht, .__ zu analysieren. die Punktnotation auf einer Zahl als Fließkommaliteral.

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

Quelle

20
Mohammad Arif

Zunge-in-Wange offensichtlich:

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

Oder Sie können in ES6 einfach Vorlagenstrings verwenden:

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

Die einfachste Möglichkeit zum Konvertieren einer Variablen in eine Zeichenfolge besteht darin, dieser Variablen eine leere Zeichenfolge hinzuzufügen. 

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

Andere Antworten haben bereits andere Optionen behandelt, aber ich bevorzuge diese:

s = `${n}`

Kurz und prägnant, wird bereits an vielen anderen Stellen verwendet (wenn Sie ein modernes Framework/eine ES-Version verwenden). Dies ist also eine sichere Wette, die jeder Programmierer verstehen wird.

Nicht, dass es (normalerweise) wichtig ist, aber es scheint zu den schnellsten zu gehören, verglichen mit anderen Methoden .

5
johndodo

Wenn Sie Format das Ergebnis auf eine bestimmte Anzahl der Dezimalstellen einstellen müssen, um beispielsweise die Währung darzustellen, benötigen Sie etwas wie die toFixed()-Methode.

number.toFixed( [digits] )

digits ist die Anzahl der nach der Dezimalstelle anzuzeigenden Ziffern.

5
Tim

Ich mag die ersten beiden, da sie einfacher zu lesen sind. Ich neige dazu, String(n) zu verwenden, aber es ist nur eine Frage des Stils als alles andere.

Es sei denn, Sie haben eine Zeile als

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

das ist sehr selbsterklärend

2
Aleadam

Ich denke, es hängt von der Situation ab, aber Sie können trotzdem die .toString()-Methode verwenden, da dies sehr klar zu verstehen ist.

2
Serghei

Ich habe https://jsperf.com verwendet, um einen Testfall für die folgenden Fälle zu erstellen:

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

Seit dem 24. Juli 2018 sagen die Ergebnisse aus, dass number + '' in Chrome der schnellste ist, in Firefox, der mit den String-Literalen der Vorlage verknüpft ist.

Sowohl String(number) als auch number.toString() sind um 95% langsamer als die schnellste Option.

 performance tests, description above

2
Erick

Wenn ich alles berücksichtigen musste, schlage ich Folgendes vor 

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

IMHO, es ist der schnellste Weg, in String umzuwandeln. Korrigiere mich, wenn ich falsch liege.

1
Kumar

Die einzige gültige Lösung für fast alle mögliche bestehende und zukünftige Fälle (Eingabe ist number, null, undefined, Symbol, alles andere) ist String(x). Verwenden Sie keine 3 Möglichkeiten für die einfache Bedienung, basierend auf Werttypannahmen, wie "hier konvertiere ich definitiv Zahl in Zeichenfolge und hier definitiv Boolean in Zeichenfolge".

Erläuterung:

String(x) behandelt Nullwerte, undefinierte Symbole, [irgendwas] und ruft .toString() für Objekte auf.

'' + x ruft .valueOf() für x (Casting to number) auf, wirft Symbole ab und kann implementierungsabhängige Ergebnisse liefern.

x.toString() wirft auf Nullen und undefined.

Hinweis: String(x) schlägt weiterhin bei prototyplosen Objekten wie Object.create(null) fehl.

Wenn Sie Zeichenfolgen wie "Hallo, nicht definiert" nicht mögen oder prototypfreie Objekte unterstützen möchten, verwenden Sie die folgende Typumwandlungsfunktion:

/**
 * 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 () ist die integrierte Typumwandlungsfunktion. Ich bin kein Experte für diese Details, aber wenn wir das integrierte Casting mit expliziten Methoden vergleichen, werden integrierte Problemumgehungen immer bevorzugt. 

1
Mubeen Khan

Wir können auch den Konstruktor String verwenden. Laut diesem Benchmark ist dies der schnellste Weg, eine Zahl in Firefox 58 in einen String umzuwandeln, auch wenn sie langsamer ist als " + num im populären Browser Google Chrome.

0
peter

Wenn Sie wissen möchten, welcher der leistungsfähigsten ist, schauen Sie sich das an, wo ich die verschiedenen Number-> String-Konvertierungen vergleiche.

Sieht aus, als wären 2+'' oder 2+"" die schnellsten.

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

0
Alex Cory

Bei der Verwendung von node.js scheint das Ergebnis ähnlich zu sein. Ich habe dieses Skript ausgeführt:

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");

und erhielt die folgenden Ergebnisse:

❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

Ähnliche Male jedes Mal, wenn ich es lief. 

0
Shahaed

Die Methode toFixed() löst auch den Zweck.

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

Sie können Number object aufrufen und dann toString() aufrufen.

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

Sie können diesen Trick für andere native Javascript-Objekte verwenden.

0
ufadiz

Ich werde dies mit mehr Daten bearbeiten, wenn ich Zeit habe, denn im Moment ist das in Ordnung ...

Test in 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")

Ausgabe  

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

Kommen Sie erst kürzlich darauf, dass die Methoden 3 und 4 nicht geeignet sind, da die Strings kopiert und dann zusammengefügt werden. Für ein kleines Programm ist dieses Problem unbedeutend, aber für jede echte Webanwendung kann diese Aktion, bei der Frequenzmanager bearbeitet werden müssen, die Leistung und Lesbarkeit beeinflussen. 

Hier ist der Link zum Lesen

0
roger