J'ai trouvé trois méthodes pour convertir une variable en String
en JavaScript.
J'ai cherché ces trois options dans le code source de jQuery et elles sont toutes utilisées .
J'aimerais savoir s’il existe des différences entre elles:
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 un si gros avantage, rien d'autre?
Ils se comportent différemment lorsque la value
est null
.
null.toString()
génère une erreur - Impossible d'appeler la méthode 'toString' de null String(null)
retourne - "null" null + ""
renvoie également - "null" Un comportement très similaire se produit si value
est undefined
(voir 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 des boucles énormes, ne vaut pas la peine de s'inquiéter.
Il existe des différences, mais elles ne sont probablement pas pertinentes pour votre question. Par exemple, le prototype toString n'existe pas sur les variables non définies, mais vous pouvez convertir un type non défini en chaîne à l'aide des deux autres méthodes:
var foo;
var myString1 = String(foo); // "undefined" as a string
var myString2 = foo + ''; // "undefined" as a string
var myString3 = foo.toString(); // throws an exception
Ils se comportent de la même manière, mais toString
fournit également un moyen de convertir un nombre de chaînes binaires, octales ou hexadécimales:
Exemple:
var a = (50274).toString(16) // "c462"
var b = (76).toString(8) // "114"
var c = (7623).toString(36) // "5vr"
var d = (100).toString(2) // "1100100"
Selon ce test JSPerf , leur vitesse est différente. Mais à moins que vous ne les utilisiez en quantités énormes, aucun d'entre eux ne devrait fonctionner correctement.
Pour être complet: Comme asawyer déjà mentionné, vous pouvez également utiliser la méthode .toString()
.
En plus de tout ce qui précède, il convient de noter que, pour une valeur définie v
:
String(v)
appelle v.toString()
'' + v
appelle v.valueOf()
avant toute transtypagePour que nous puissions faire quelque chose comme:
var mixin = {
valueOf: function () { return false },
toString: function () { return 'true' }
};
mixin === false; // false
mixin == false; // true
'' + mixin; // "false"
String(mixin) // "true"
testé dans les versions 34.0 et Node 0.1
si vous êtes ok avec null, undefined, NaN, 0 et false, le transtypage en '' alors (s ? s+'' : '')
est plus rapide.
voir http://jsperf.com/cast-to-string/8
remarque - il existe actuellement des différences significatives entre les navigateurs.
Exemple concret: j'ai une fonction de journal pouvant être appelée avec un nombre arbitraire de paramètres: log("foo is {} and bar is {}", param1, param2)
. Si un indicateur DEBUG
est défini sur true
, les crochets sont remplacés par les paramètres donnés et la chaîne est transmise à console.log(msg)
. Les paramètres peuvent et seront des chaînes, des nombres et tout ce qui peut être retourné par les appels JSON/AJAX, peut-être même null
.
arguments[i].toString()
n'est pas une option, en raison des valeurs possibles de null
(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.Sur cette page, vous pouvez tester les performances de chaque méthode vous-même :)
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.