Considérez ce code:
var age = 3;
console.log("I'm " + age + " years old!");
Existe-t-il d'autres façons d'insérer la valeur d'une variable dans une chaîne, en dehors de la concaténation de chaîne?
javascript
string
string-interpolation
Tom Lehman
la source
la source
Show GRAPH of : ${fundCode}-${funcCode}
m'obtientShow GRAPH of : AIP001-_sma
(utilisez des astuces autour de la chaîne 1 .... ne semble pas s'afficher ici)Réponses:
Depuis ES6, vous pouvez utiliser des littéraux de modèle :
PS Notez l'utilisation de guillemets obliques:
``
.la source
tl; dr
Utilisez les littéraux de chaîne de modèle d'ECMAScript 2015, le cas échéant.
Explication
Il n'y a aucun moyen direct de le faire, selon les spécifications ECMAScript 5, mais ECMAScript 6 a des chaînes de modèle , qui étaient également connues sous le nom de quasi-littéraux lors de la rédaction de la spécification. Utilisez-les comme ceci:
Vous pouvez utiliser n'importe quelle expression JavaScript valide à l'intérieur du
{}
. Par exemple:L'autre chose importante est que vous n'avez plus à vous soucier des chaînes multi-lignes. Vous pouvez les écrire simplement comme
Remarque: J'ai utilisé io.js v2.4.0 pour évaluer toutes les chaînes de modèle illustrées ci-dessus. Vous pouvez également utiliser la dernière version de Chrome pour tester les exemples ci-dessus.
Remarque: Les spécifications ES6 sont maintenant finalisées , mais doivent encore être implémentées par tous les principaux navigateurs.
Selon les pages du Réseau des développeurs Mozilla , cela sera implémenté pour une prise en charge de base à partir des versions suivantes: Firefox 34, Chrome 41, Internet Explorer 12. Si vous êtes un utilisateur d'Opera, Safari ou Internet Explorer et que cela vous intéresse maintenant , ce banc d'essai peut être utilisé pour jouer jusqu'à ce que tout le monde soit soutenu.
la source
Remedial JavaScript de Douglas Crockford comprend une
String.prototype.supplant
fonction. Il est court, familier et facile à utiliser:Si vous ne voulez pas changer le prototype de String, vous pouvez toujours l'adapter pour qu'il soit autonome, ou le placer dans un autre espace de noms, ou autre.
la source
"The {0} says {1}, {1}, {1}!".supplant(['cow', 'moo'])
Attention: évitez tout système de modèles qui ne vous permet pas d'échapper à ses propres délimiteurs. Par exemple, il n'y aurait aucun moyen de sortir ce qui suit en utilisant la
supplant()
méthode mentionnée ici.L'interpolation simple peut fonctionner pour les petits scripts autonomes, mais est souvent accompagnée de cette faille de conception qui limitera toute utilisation sérieuse. Je préfère honnêtement les modèles DOM, tels que:
Et utilisez la manipulation jQuery:
$('#age').text(3)
Alternativement, si vous êtes simplement fatigué de la concaténation de chaînes, il existe toujours une syntaxe alternative:
la source
Array.join()
est plus lent que la+
concaténation directe ( style), car les moteurs de navigateur (qui incluent V8, qui inclut le nœud et presque tout ce qui exécute JS aujourd'hui) l'ont optimisé massivement et il y a beaucoup de différence en faveur de la concaténation directetoken
- donc à condition que vous ne fournissiez pas d'objet de données qui a unage
membre, ce sera bien.supplant
est injustifié:"I am 3 years old thanks to my {age} variable.".supplant({}));
renvoie exactement la chaîne donnée. Si ellesage
étaient données, on pourrait toujours imprimer{
et}
utiliser{{age}}
Essayez la bibliothèque sprintf (une implémentation complète de sprintf JavaScript open source). Par exemple:
vsprintf prend un tableau d'arguments et renvoie une chaîne formatée.
la source
J'utilise ce modèle dans de nombreuses langues quand je ne sais pas encore comment le faire correctement et je veux juste avoir une idée rapidement:
Bien qu'il ne soit pas particulièrement efficace, je le trouve lisible. Il fonctionne toujours et est toujours disponible:
TOUJOURS
la source
Vous pouvez utiliser le système de modèles de Prototype si vous avez vraiment envie d'utiliser un marteau pour casser un écrou:
la source
Vous pouvez facilement utiliser ES6
template string
et transposer en ES5 en utilisant n'importe quel transpilaire disponible comme babel.http://www.es6fiddle.net/im3c3euc/
la source
Essayez le kiwi , un module JavaScript léger pour l'interpolation de chaînes.
Tu peux faire
ou
la source
Si vous voulez interpoler en
console.log
sortie, alors justeVoici
%s
ce qu'on appelle un "spécificateur de format".console.log
a ce type de support d'interpolation intégré.la source
Voici une solution qui vous oblige à fournir un objet avec les valeurs. Si vous ne fournissez pas d'objet comme paramètre, il utilisera par défaut des variables globales. Mais il vaut mieux s'en tenir à l'utilisation du paramètre, c'est beaucoup plus propre.
la source
eval
,eval
c'est mal!eval
, mais parfois non. Par exemple, si l'OP voulait un moyen d'interpoler en utilisant la portée actuelle, sans avoir à passer un objet de recherche (comme le fonctionnement de l'interpolation Groovy), je suis presque sûr que ceeval
serait nécessaire. Ne vous contentez pas de recourir à l'ancien "eval is evil".eval
c'est le seul moyen d'accéder aux variables locales de portée . Alors ne le rejetez pas simplement parce que ça fait mal à vos sentiments. BTW, je préfère également la voie alternative car c'est plus sûr, mais laeval
méthode est ce qui répond précisément à la question d'OP, donc c'est dans la réponse.eval
est qu'il ne peut pas accéder aux variables à partir d'une autre étendue, donc si votre.interpolate
appel est dans une autre fonction, et non global, cela ne fonctionnera pas.En développant la deuxième réponse de Greg Kindel , vous pouvez écrire une fonction pour éliminer une partie du passe-partout:
Usage:
la source
Je peux vous montrer avec un exemple:
la source
Depuis ES6, si vous souhaitez effectuer une interpolation de chaîne dans les clés d'objet, vous obtiendrez un
SyntaxError: expected property name, got '${'
si vous faites quelque chose comme:Vous devriez plutôt faire ce qui suit:
la source
la source
L'utilisation de la syntaxe des modèles échoue dans les anciens navigateurs, ce qui est important si vous créez du HTML pour un usage public. L'utilisation de la concaténation est fastidieuse et difficile à lire, en particulier si vous avez de nombreuses expressions ou des expressions longues, ou si vous devez utiliser des parenthèses pour gérer les mélanges d'éléments de nombre et de chaîne (les deux utilisant l'opérateur +).
PHP étend les chaînes entre guillemets contenant des variables et même certaines expressions en utilisant une notation très compacte:
$a="the color is $color";
En JavaScript, une fonction efficace peut être écrite pour supporter ceci:,
var a=S('the color is ',color);
en utilisant un nombre variable d'arguments. Bien qu'il n'y ait aucun avantage sur la concaténation dans cet exemple, lorsque les expressions s'allongent, cette syntaxe peut être plus claire. Ou on peut utiliser le signe dollar pour signaler le début d'une expression à l'aide d'une fonction JavaScript, comme en PHP.D'un autre côté, il ne serait pas difficile d'écrire une fonction de contournement efficace pour fournir une extension de type modèle de chaînes pour les navigateurs plus anciens. Quelqu'un l'a probablement déjà fait.
Enfin, j'imagine que sprintf (comme en C, C ++ et PHP) pourrait être écrit en JavaScript, même si ce serait un peu moins efficace que ces autres solutions.
la source
Interpolation flexible personnalisée:
la source
Bien que les modèles soient probablement les meilleurs pour le cas que vous décrivez, si vous avez ou voulez vos données et / ou arguments sous forme itérable / tableau, vous pouvez les utiliser
String.raw
.Avec les données sous forme de tableau, on peut utiliser l'opérateur d'étalement:
la source
Impossible de trouver ce que je cherchais, puis je l'ai trouvé -
Si vous utilisez Node.js, il existe un
util
package intégré avec une fonction de formatage qui fonctionne comme ceci:Par coïncidence, cela est désormais intégré aux
console.log
saveurs dans Node.js -la source