2010-07-21 6 views

Répondre

264

A partir de Firefox 34/Chrome 41/Safari 9/Microsoft bord, vous pouvez utiliser une fonction ES2015/ES6 appelé Template Literals et utiliser cette syntaxe:

`String text ${expression}` 

Les littéraux de modèle sont entourés par le back-tick (``) (accent grave) au lieu de guillemets doubles ou simples.

Exemple:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b}.`); 
// "Fifteen is 15. 

Comment pur est-ce?

Bonus:

Il permet également des chaînes multi-lignes en javascript sans échapper, ce qui est excellent pour les modèles:

return ` 
    <div class="${foo}"> 
     ... 
    </div> 
`; 

Browser support:

Comme cette syntaxe est non pris en charge par les anciens navigateurs (Internet Explorer et Safari < = 8), vous pouvez utiliser Babel pour transférer votre code dans ES5 pour s'assurer qu'il fonctionnera partout.


Side note:

A partir de IE8 + vous pouvez utiliser la chaîne de base mise en forme à l'intérieur console.log:

console.log('%s is %d.', 'Fifteen', 15); 
// Fifteen is 15. 
+22

Ne manquez pas le fait que la chaîne du modèle est délimitée par des graduations (\ ') à la place de vos guillemets normaux. '' $ {Foo} "' est littéralement $ {foo} '\' $ {foo} \ '' est ce que vous voulez vraiment – Hovis

+1

Il ya aussi beaucoup de transpileurs pour transformer ES6 en ES5 pour résoudre le problème de compatibilité! – Omid

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, ce qui n'était pas possible en javascript. Vous devrez recourir à:

var hello = "foo"; 
var my_string = "I pity the " + hello; 
+2

Il sera bientôt possible en javascript (ES6) avec des chaînes modèles, voir ma réponse détaillée ci-dessous. – bformet

+0

[Il est possible] (http://stackoverflow.com/a/28497562/1189651) si vous aimez écrire CoffeeScript, qui est en fait javascript avec une meilleure syntaxe – bformet

37

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, non. Bien que vous pouvez essayer d'obtenir sprintf for JavaScript à mi-chemin:

var hello = "foo"; 
var my_string = sprintf("I pity the %s", hello); 
+0

Merci Si vous utilisez dojo, sprintf est disponible en module: http://bill.dojotoolkit.org/api/1.9/dojox/string/sprintf – user64141

4

Si vous essayez de faire interpolation pour microtemplating, j'aime Mustache.js à cette fin.

18

bien vous pouvez le faire, mais ce n'est pas esp général

'I pity the $fool'.replace('$fool', 'fool') 

Vous pouvez facilement écrire une fonction qui fait cela intelligemment si vous avez vraiment besoin de

+1

Bon, mais j'imagine qu'il y aurait un coup de performance. –

7

Si vous aimez écrire CoffeeScript vous pouvez faire:

hello = "foo" 
my_string = "I pity the #{hello}" 

CoffeeScript est en fait javasc ript, mais avec une syntaxe bien meilleure.

Pour une présentation de CoffeeScript, cochez cette case beginner's guide.

3

Vous pouvez utiliser cette fonction javascript pour effectuer ce type de gabarit. Pas besoin d'inclure une bibliothèque entière.

function createStringFromTemplate(template, variables) { 
    return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){ 
     return variables[varName]; 
    }); 
} 

createStringFromTemplate(
    "I would like to receive email updates from {list_name} {var1} {var2} {var3}.", 
    { 
     list_name : "this store", 
     var1  : "FOO", 
     var2  : "BAR", 
     var3  : "BAZ" 
    } 
); 

sortie: "I would like to receive email updates from this store FOO BAR BAZ."

l'aide d'une fonction d'argument de la fonction String.replace() fait partie de la spécification de l'ECMAScript. Voir this SO answer pour plus de détails.

+0

Est-ce efficace? – momomo

+0

L'efficacité dépendra en grande partie du navigateur de l'utilisateur, puisque cette solution délègue la «lourde tâche» de faire correspondre l'expression régulière et de remplacer les chaînes par les fonctions natives du navigateur. Dans tous les cas, puisque cela se passe du côté des navigateurs, l'efficacité n'est pas un problème si important. Si vous souhaitez un modèle côté serveur (pour Node.JS ou similaire), vous devez utiliser la solution de littéraux de modèle ES6 décrite par @bformet, car elle est probablement plus efficace. – Eric

5

réponse complète, prêt à être utilisé:

var Strings = { 
     create : (function() { 
       var regexp = /{([^{]+)}/g; 

       return function(str, o) { 
        return str.replace(regexp, function(ignore, key){ 
          return (key = o[key]) == null ? '' : key; 
        }); 
       } 
     })() 
}; 

Appel comme

Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'}); 

Pour le joindre à String.prototype:

String.prototype.create = function(o) { 
      return Strings.create(this, o); 
} 

Ensuite, utilisez comme:

"My firstname is ${first}".create({first:'Neo'}); 
1

j'ai écrit ce paquet NPM stringinject https://www.npmjs.com/package/stringinject qui vous permet d'effectuer les opérations

suivantes
var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]); 

qui remplacera le {0} et {1} avec les éléments du tableau et retourner la chaîne suivante

"this is a test string for stringInject" 

ou vous pouvez remplacer les espaces réservés avec des clés d'objets et valeurs comme ceci:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); 

"My username is tjcafferkey on Github" 
0

Eh bien, vous pouvez utiliser this is ${variable} ou vous pouvez utiliser "this is "+variable Ces deux fonctionnent bien.

Pensez également à utiliser le tilde (``) clé autour du this is ${variable} au lieu de "ou"

+0

Cette réponse ressemble à un doublon. –