Casten naar string in JavaScript

Ik heb drie manieren gevonden om een ​​variabele naar Stringte casten in JavaScript.
Ik heb naar die drie opties gezocht in de jQuery-broncode en ze zijn allemaal in gebruik.
Ik zou graag willen weten of er verschillen zijn tussen hen:

value.toString()
String(value)
value + ""

DEMO

Ze produceren allemaal dezelfde output, maar doet de ene beter dan de andere?
Ik zou zeggen dat de + ""het voordeel heeft dat het een aantal karakters opslaat, maar dat is niet zo’n groot voordeel, iets anders?


Antwoord 1, autoriteit 100%

Ze gedragen zich anders als de valuenullis.

  • null.toString()geeft een fout – Kan methode ‘toString’ van null niet aanroepen
  • String(null)geeft als resultaat – “null”
  • null + ""retourneert ook – “null”

Zeer soortgelijk gedrag treedt op als valueundefinedis (zie het antwoord van jbabey).

Anders dan dat, is er een verwaarloosbaar prestatieverschil, dat, tenzij je ze in enorme loops gebruikt, niet de moeite waard is om je zorgen over te maken.


Antwoord 2, autoriteit 13%

Er zijn verschillen, maar die zijn waarschijnlijk niet relevant voor uw vraag. Het toString-prototype bestaat bijvoorbeeld niet op ongedefinieerde variabelen, maar u kunt ongedefinieerd naar een string casten met behulp van de andere twee methoden:

​var foo;
​var myString1 = String(foo); // "undefined" as a string
var myString2 = foo + ''; // "undefined" as a string
var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/


Antwoord 3, autoriteit 8%

Ze gedragen zich hetzelfde, maar toStringbiedt ook een manier om binaire, octale of hexadecimale getallen te converteren:

Voorbeeld:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"

Antwoord 4, autoriteit 4%

Naast al het bovenstaande moet worden opgemerkt dat voor een gedefinieerde waarde v:

  • String(v)roept v.toString()
  • aan

  • '' + vroept v.valueOf()aan voorafgaand aan een ander type cast

Dus we zouden zoiets kunnen doen:

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

Getest in FF 34.0 en Node 0.10


Antwoord 5, autoriteit 4%

Volgens deze JSPerf-testverschillen ze in snelheid. Maar tenzij je ze in grote hoeveelheden gaat gebruiken, zou elk van hen prima moeten presteren.

Voor de volledigheid: zoals asawyeral genoemd, kunt u ook de .toString()methode.


Antwoord 6, autoriteit 3%

als je akkoord gaat met null, undefined, NaN, 0 en false all casting naar ”, dan is (s ? s+'' : '')sneller.

zie http://jsperf.com/cast-to-string/8

opmerking – er zijn op dit moment aanzienlijke verschillen tussen browsers.


Antwoord 7, autoriteit 2%

Voorbeeld uit de echte wereld: ik heb een logfunctie die kan worden aangeroepen met een willekeurig aantal parameters: log("foo is {} and bar is {}", param1, param2). Als een DEBUG-vlag is ingesteld op true, worden de haakjes vervangen door de opgegeven parameters en wordt de tekenreeks doorgegeven aan console.log(msg). Parameters kunnen en zullen Strings, Numbers en wat dan ook zijn dat kan worden geretourneerd door JSON / AJAX-aanroepen, misschien zelfs null.

  • arguments[i].toString()is geen optie, vanwege mogelijke null-waarden (zie het antwoord van Connell Watkins)
  • JSLint zal klagen over arguments[i] + "". Dit kan al dan niet van invloed zijn op een beslissing over wat te gebruiken. Sommige mensen houden zich strikt aan JSLint.
  • In sommige browsers is het aaneenschakelen van lege tekenreeksen iets sneller dan het gebruik van de tekenreeksfunctie of tekenreeksconstructor (zie JSPerf-test in Sammys S. antwoord). In Opera 12 en Firefox 19 is het aaneenschakelen van lege strings belachelijk sneller (95% in Firefox 19)– of in ieder geval JSPerfzegt van wel.

Antwoord 8

Op deze pagina kun je de prestaties van elke methode zelf testen 🙂

http://jsperf.com/cast-to-string/2

hier, op alle machines en browsers, is ‘ “” + str‘ de snelste, (String)str is de langzaamste

Other episodes