Quelle est la "meilleure" façon de convertir un nombre en une chaîne (en termes d'avantage de vitesse, de clarté, de mémoire, etc.)?
Quelques exemples:
String(n)
n.toString()
""+n
n+""
la source
Quelle est la "meilleure" façon de convertir un nombre en une chaîne (en termes d'avantage de vitesse, de clarté, de mémoire, etc.)?
Quelques exemples:
String(n)
n.toString()
""+n
n+""
comme ça:
var foo = 45;
var bar = '' + foo;
En fait, même si je le fais généralement comme ça pour plus de commodité, sur plus de 1 000 itérations, il semble que la vitesse brute présente un avantage pour.toString()
Voir les tests de performance ici (pas par moi, mais trouvés quand je suis allé écrire le mien): http://jsben.ch/#/ghQYR
Le plus rapide basé sur le test JSPerf ci-dessus: str = num.toString();
Il convient de noter que la différence de vitesse n'est pas trop importante si l'on considère qu'elle peut effectuer la conversion de quelque manière que ce soit 1 million de fois en 0,1 seconde .
Mise à jour: la vitesse semble différer considérablement selon le navigateur. Dans Chrome num + ''
semble être le plus rapide basé sur ce test http://jsben.ch/#/ghQYR
Mise à jour 2: Encore une fois sur la base de mon test ci-dessus, il convient de noter que Firefox 20.0.1 exécute .toString()
environ 100 fois plus lentement que l' '' + num
échantillon.
'' + 123e-50
retourne"1.23e-48"
.null foo
ne renvoie pas d'erreur.À mon avis,
n.toString()
prend le prix pour sa clarté, et je ne pense pas qu'il entraîne des frais généraux supplémentaires.la source
null
,undefined
) qui ne fonctionnent pas avec cette réponse la rend à peine «dangereuse».null
ouundefined
car il est spécifique à l'application, alors que j'imagine que(n || defaultNumber).toString()
c'est ce que la plupart des gens voudraient dans une telle situation, je suis fortement en désaccord que nous devrions l'intégrer dans toutes les questions. Il s'agissait de convertir des nombres en chaînes, une bonne architecture et d'autres conversions de type si nécessaire sont des leçons séparées.Les conversions explicites sont très claires pour quelqu'un qui est nouveau dans la langue. L'utilisation de la coercition de type, comme d'autres l'ont suggéré, conduit à une ambiguïté si un développeur n'est pas au courant des règles de coercition. En fin de compte, le temps de développement est plus coûteux que le temps CPU, donc j'optimiserais pour le premier au détriment du second. Cela étant dit, dans ce cas, la différence est probablement négligeable, mais sinon je suis sûr qu'il existe des compresseurs JavaScript décents qui optimiseront ce genre de chose.
Donc, pour les raisons ci-dessus, j'irais avec:
n.toString()
ouString(n)
.String(n)
est probablement un meilleur choix car il n'échouera pas s'iln
est nul ou non défini.la source
null
, ouundefined
. Sin
c'estnull
ou enundefined
raison d'un bogue dans mon programme, je préférerais que mon programme échoue dans cet état, pour me donner une meilleure chance de trouver et de corriger le bogue. Les plantages de programmes sont des cadeaux pour le programmeur, pour l'aider à trouver les bugs :-). L'alternative est de fournir un logiciel qui ne fonctionne pas comme prévu, après avoir soigneusement ignoré les bogues. Donc, je ne suis pas fan de l'utilisationString(n)
pour masquer une erreur.String(n)
est bon pour une utilisation dans un style fonctionnel, par exemple avec la combinaison de soulignement_.compose(funcThatNeedsAStringParam, String)
.La source
la source
La langue en joue évidemment:
Ou dans ES6, vous pouvez simplement utiliser des chaînes de modèle :
la source
'' + number
méthode. Cela dit, les résultats de ces benchmarks varient beaucoup lors de leur exécution plusieurs fois, donc je ne sais pas s'ils doivent être pris trop au sérieux.D'autres réponses couvraient déjà d'autres options, mais je préfère celle-ci:
Court, succinct, déjà utilisé dans de nombreux autres endroits (si vous utilisez une version framework / ES moderne), il est donc fort à parier que tout programmeur le comprendra.
Non pas que cela (généralement) compte beaucoup, mais il semble également être parmi les plus rapides par rapport à d' autres méthodes .
la source
n.toString()
alors, n'est-ce pas?n
est,undefined
il générera une erreur de syntaxe en utilisant.toString()
String(n)
dans tous les cas? La seule différence est que c'est moins clair.La façon la plus simple de convertir une variable en chaîne consiste à ajouter une chaîne vide à cette variable.
la source
(5.41 + '')
pour utiliser les méthodes String comme.substring()
et d'autresSi vous devez formater le résultat en un nombre spécifique de décimales, par exemple pour représenter la devise, vous avez besoin de quelque chose comme la
toFixed()
méthode.digits
est le nombre de chiffres à afficher après la décimale.la source
J'ai utilisé https://jsperf.com pour créer un cas de test pour les cas suivants:
https://jsperf.com/number-string-conversion-speed-comparison
Au 24 juillet 2018, les résultats indiquent que
number + ''
c'est le plus rapide dans Chrome, dans Firefox qui est lié aux littéraux de chaîne de modèle.Les deux
String(number)
, etnumber.toString()
sont environ 95% plus lents que l'option la plus rapide.la source
J'aime les deux premiers car ils sont plus faciles à lire. J'ai tendance à utiliser
String(n)
mais c'est juste une question de style que toute autre chose.C'est à moins que vous ayez une ligne comme
ce qui est très explicite
la source
Je pense que cela dépend de la situation mais de toute façon vous pouvez utiliser la
.toString()
méthode car elle est très claire à comprendre.la source
.toString () est la fonction de transtypage intégrée, je ne suis pas spécialiste de ces détails, mais chaque fois que nous comparons des méthodologies explicites de transtypage de type intégrées, les solutions de contournement intégrées sont toujours préférées.
la source
Si je devais tout prendre en considération, je vous proposerais de suivre
À mon humble avis, c'est le moyen le plus rapide de convertir en chaîne. Corrigez-moi si je me trompe.
la source
La seule solution valable pour presque tous les cas existants et futurs possibles (entrée est nombre, null, non défini, symbole, toute autre chose) est
String(x)
. N'utilisez pas 3 méthodes pour un fonctionnement simple, en vous basant sur des hypothèses de type valeur, comme "ici, je convertis définitivement le nombre en chaîne et ici définitivement le booléen en chaîne".Explication:
String(x)
gère les valeurs nulles, non définies, les symboles, [n'importe quoi] et appelle les.toString()
objets.'' + x
appelle.valueOf()
x (transtypage en nombre), lance des symboles, peut fournir des résultats dépendants de l'implémentation.x.toString()
jette sur null et indéfini.Remarque:
String(x)
échouera toujours sur les objets sans prototype commeObject.create(null)
.Si vous n'aimez pas les chaînes comme «Bonjour, non défini» ou si vous souhaitez prendre en charge des objets sans prototype, utilisez la fonction de conversion de type suivante:
la source
Avec les littéraux numériques, le point d'accès à une propriété doit être distingué du point décimal. Cela vous laisse les options suivantes si vous souhaitez invoquer String () sur le littéral numérique 123:
la source
Voici les méthodes pour convertir un entier en chaîne dans JS
Les méthodes sont classées par ordre décroissant de performances.
(Les résultats des tests de performance sont donnés par @DarckBlezzer dans sa réponse)
var num = 1
Méthode 1:
num = `$ {num}`
Méthode 2:
num = num + ''
Méthode 3:
num = chaîne (num)
Méthode 4:
num = num.toString ()
Remarque: vous ne pouvez pas appeler directement tostring () à partir d'un numéro
Par exemple: 2.toString () lancera Uncaught SyntaxError : jeton invalide ou inattendu
la source
Si vous êtes curieux de savoir lequel est le plus performant, vérifiez ceci où je compare toutes les différentes conversions Number -> String.
Ressemble
2+''
ou2+""
est le plus rapide.https://jsperf.com/int-2-string
la source
Nous pouvons également utiliser le constructeur String . Selon cette référence, c'est le moyen le plus rapide de convertir un nombre en chaîne dans Firefox 58, même s'il est plus lent que
" + num
dans le navigateur populaire Google Chrome.la source
La méthode
toFixed()
résoudra également le but.la source
Vous pouvez appeler
Number
objet, puis appelertoString()
.Number.call(null, n).toString()
Vous pouvez utiliser cette astuce pour un autre objet natif javascript.
la source
Je viens de découvrir cela récemment, les méthodes 3 et 4 ne sont pas appropriées car la façon dont les chaînes sont copiées puis assemblées. Pour un petit programme, ce problème est insignifiant, mais pour toute application Web réelle, cette action où nous devons faire face à des manipulations de chaînes de fréquence peut affecter les performances et la lisibilité.
Voici le lien à lire .
la source
Je vais rééditer cela avec plus de données quand j'en aurai le temps, car pour l'instant ça va ...
Test dans nodejs v8.11.2: 2018/06/06
production
la source
Il semble des résultats similaires lors de l'utilisation de node.js. J'ai exécuté ce script:
et a obtenu les résultats suivants:
Des temps similaires chaque fois que je l'ai couru
la source