web-dev-qa-db-fra.com

Casting à la chaîne en JavaScript

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 + ""

DÉMO

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?

172
gdoron

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.

196
Connell

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

http://jsfiddle.net/f8YwA/

26
jbabey

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"
16
Sarfraz

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().

9
Sammy S.

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 transtypage

Pour 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

7
Simone C.

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.

7
jldec

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)
  • JSLint va se plaindre de arguments[i] + "". Cela peut ou non influencer une décision sur ce qu'il faut utiliser. Certaines personnes adhèrent strictement à JSLint.
  • Dans certains navigateurs, la concaténation de chaînes vides est un peu plus rapide que d'utiliser une fonction de chaîne ou un constructeur de chaîne (voir Test de JSPerf dans Sammys S. answer). Dans Opera 12 et Firefox 19, la concaténation de chaînes vides est extrêmement rapide (95% dans Firefox 19) - ou du moins - JSPerf le dit.
3
Jack

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.

1
itinance