2010-07-21 67 views

risposta

264

A partire da Firefox 34/Chrome 41/Safari 9/Microsoft Edge è possibile utilizzare un ES2015/funzione ES6 chiamato Template Literals e utilizzare la seguente sintassi:

`String text ${expression}` 

I letterali modello sono racchiusi da back-tick (``) (accento grave) invece di virgolette singole o doppie.

Esempio:

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

Come pulito è quello?

Bonus:

Permette anche per le stringhe multilinea in javascript, senza fuggire, che è grande per i modelli:

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

Browser support:

Poiché questa sintassi è non supportato dai browser più vecchi (Internet Explorer e Safari < = 8), potresti voler utilizzare Babel per trasporre il tuo codice in ES5 per assicurarti che funzioni ovunque.


Nota a margine:

A partire da IE8 + è possibile utilizzare stringa di base formattazione all'interno console.log:

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

Non perdere il fatto che la stringa del modello è delimitata da spunti posteriori (\ ') al posto dei normali caratteri di citazione. '" $ {foo} "' è letteralmente $ {foo} '\' $ {pippo} \ '' è ciò che realmente vuoi – Hovis

+1

Inoltre ci sono molti transporter per trasformare ES6 in ES5 per risolvere il problema di compatibilità! – Omid

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, no, che non era possibile in javascript. Si dovrà ricorrere a:

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

sarà presto possibile in javascript (ES6) con Stringhe modello Inoltre, vedere la mia risposta dettagliata di seguito. – bformet

+0

[E' possibile] (http://stackoverflow.com/a/28497562/1189651) se ti piace scrivere CoffeeScript, che in realtà è javascript con una sintassi migliore. – bformet

37

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, no. Anche se si potrebbe provare sprintf for JavaScript per arrivare a metà strada:

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

Grazie. Se stai usando dojo, sprintf è disponibile come modulo: http://bill.dojotoolkit.org/api/1.9/dojox/string/sprintf – user64141

4

Se stai cercando di fare interpolazione per microtemplating, mi piace Mustache.js a tale scopo.

18

bene si potrebbe fare questo, ma non è esp generale

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

Si potrebbe facilmente scrivere una funzione che fa questo in modo intelligente se veramente avevi bisogno di

+1

Bene, ma immagino che ci sarebbe un successo in termini di prestazioni. –

7

Se ti piace scrivere CoffeeScript si potrebbe fare:

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

CoffeeScript in realtà È javasc ript, ma con una sintassi molto migliore.

Per una panoramica di CoffeeScript, controllare questo beginner's guide.

3

È possibile utilizzare questa funzione javascript per eseguire questa sorta di modellazione. Non è necessario includere un'intera libreria.

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" 
    } 
); 

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

Utilizzando una funzione come argomento della funzione String.replace() era parte del ECMAScript v3 spec. Vedi this SO answer per maggiori dettagli.

+0

È efficiente? – momomo

+0

L'efficienza dipenderà in gran parte dal browser dell'utente, dal momento che questa soluzione delega il "sollevamento" di corrispondenza della regex e la sostituzione delle stringhe con le funzioni native del browser. In ogni caso, dal momento che questo sta accadendo comunque dal lato del browser, l'efficienza non è una preoccupazione così grande. Se si desidera il modello sul lato server (per Node.JS o simile) si dovrebbe usare la soluzione di template letterali ES6 descritta da @bformet, poiché è probabilmente più efficiente. – Eric

5

risposta completa, pronta per essere utilizzata:

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

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

chiamata come

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

per fissarlo al String.prototype:

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

Quindi utilizzare come:

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

Ho scritto questo pacchetto npm stringinject https://www.npmjs.com/package/stringinject che consente di effettuare le seguenti operazioni

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

che sostituirà il {0} e {1} con gli elementi di matrice e tornare la seguente stringa

"this is a test string for stringInject" 

o si potrebbe sostituire i segnaposto con chiavi oggetto e valori in questo modo:

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

"My username is tjcafferkey on Github" 
0

Bene, è possibile utilizzare this is ${variable} oppure è possibile utilizzare "this is "+variable Entrambi funzionano bene.

ricordarsi di utilizzare il tilda (``) chiave di tutto il this is ${variable} al posto di "o '

+0

Questa risposta sembra un duplicato. –

Problemi correlati