J'ai trouvé trois façons de convertir une variable String
en JavaScript.
J'ai recherché ces trois options dans le code source de jQuery, et elles sont toutes utilisées .
J'aimerais savoir s'il y a des différences entre eux:
value.toString()
String(value)
value + ""
Ils produisent tous le même résultat, mais l'un d'eux est-il meilleur que les autres?
Je dirais que le + ""
a l'avantage de sauver certains personnages, mais ce n'est pas ce gros avantage, autre chose?
javascript
jquery
string
gdoron soutient Monica
la source
la source
toString()
serait la voie à suivre.toString
c'est sémantiquement le moyen le plus clair d'auto-documenter le fait que vous essayez d'obtenir une chaîne équivalente à un objet.String(...)
est un peu obtus, etvalue + ""
c'est un peu un hack. Cela vous donne également la possibilité de remplacer la valeurtoString
par défaut avec une implémentation personnalisée si jamais vous en aviez besoin, je suppose, comme avantage secondaire mineur.+ ""
c'est le plus rapide selon le jsperf, donc ... il le fait d'une autre manière je suppose.Réponses:
Ils se comportent différemment quand ils le
value
sontnull
.null.toString()
renvoie une erreur - Impossible d'appeler la méthode 'toString' de nullString(null)
renvoie - "null"null + ""
renvoie également - "null"Un comportement très similaire se produit si
value
c'estundefined
(voir la réponse de jbabey ).En dehors de cela, il existe une différence de performance négligeable qui, à moins que vous ne les utilisiez dans d'énormes boucles, ne vaut pas la peine de s'inquiéter.
la source
toString()
lorsque vous n'avez pas encore vérifiénull
.null
ouundefined
à l'écran est un comportement plus souhaitable qu'une erreur javascript ...v + ''
renvoie un résultat incorrect si v a à la fois les méthodes toString () et valueOf (). La concaténation ignorera toString () et utilisera valueOf (). Exemple de classe pour laquelle la concaténation échoue: github.com/processing-js/processing-js/blob/…Il existe des différences, mais elles ne sont probablement pas pertinentes pour votre question. Par exemple, le prototype toString n'existe pas sur des variables non définies, mais vous pouvez convertir undefined en chaîne à l'aide des deux autres méthodes:
http://jsfiddle.net/f8YwA/
la source
String()
. Exemple:String(test);
lanceUncaught ReferenceError: test is not defined
, tandis quevar test; String(test);
cela entraînera"undefined"
.Ils se comportent de la même manière mais
toString
fournissent également un moyen de convertir un nombre de chaînes binaires, octales ou hexadécimales:Exemple:
la source
Selon ce test JSPerf , ils diffèrent en vitesse. Mais à moins que vous ne les utilisiez en grande quantité, n'importe lequel d'entre eux devrait fonctionner correctement.
Par souci d' exhaustivité: comme un avocat l'a déjà mentionné, vous pouvez également utiliser la
.toString()
méthode.la source
new String()
retourne un objet pas unString
new String()
renvoie un objet oui.String()
, cependant, renvoie une chaîne, qui est celle de la question.new String(blarg)
vous donne unString
objet sur lequel vous pouvez faire appeltoString()
. Dans mon débogueur Chrome, ils résultent effectivement du même type d'objet, à l'exception de cette différence.En plus de tout ce qui précède, il faut noter que, pour une valeur définie
v
:String(v)
appelsv.toString()
'' + v
appelsv.valueOf()
avant tout autre type de diffusionNous pourrions donc faire quelque chose comme:
Testé dans FF 34.0 et Node 0.10
la source
si vous êtes d'accord avec null, undefined, NaN, 0 et false, tout cast en «»
(s ? s+'' : '')
est alors plus rapide.voir http://jsperf.com/cast-to-string/8
Remarque - il existe actuellement des différences significatives entre les navigateurs.
la source
Exemple concret: J'ai une fonction de journal qui peut être appelé avec un nombre arbitraire de paramètres:
log("foo is {} and bar is {}", param1, param2)
. Si unDEBUG
indicateur est défini surtrue
, les crochets sont remplacés par les paramètres donnés et la chaîne est passée àconsole.log(msg)
. Les paramètres peuvent être et seront des chaînes, des nombres et tout ce qui peut être retourné par les appels JSON / AJAX, peut-être mêmenull
.arguments[i].toString()
n'est pas une option, à cause desnull
valeurs possibles (voir la réponse de Connell Watkins)arguments[i] + ""
. Cela peut ou non influencer une décision sur ce qu'il faut utiliser. Certaines personnes adhèrent strictement à JSLint.la source
Sur cette page, vous pouvez tester vous-même les performances de chaque méthode :)
http://jsperf.com/cast-to-string/2
ici, sur toutes les machines et tous les navigateurs, ' "" + str ' est le plus rapide, (String) str est le plus lent
la source