2010-07-21 12 views

Respuesta

264

A partir de Firefox 34/Chrome 41/Safari 9/Microsoft Edge puede utilizar un ES2015/función ES6 llama Template Literals y utilizar esta sintaxis:

`String text ${expression}` 

Los literales de plantilla están encerrados por back-tick (``) (acento grave) en lugar de comillas dobles o simples.

Ejemplo:

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

Cómo limpio es eso?

Bono:

También permite cadenas multilínea en javascript sin escapar, que es ideal para las plantillas:

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

Browser support:

Como esta sintaxis es no es compatible con navegadores más antiguos (Internet Explorer y Safari < = 8), es posible que desee utilizar Babel para transpilar su código en ES5 para asegurarse de que se ejecutará en todas partes.


Nota al margen:

A partir de IE8 + puede utilizar cadena básica de formatear el interior console.log:

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

No se pierda el hecho de que la cadena de la plantilla está delimitada con marcas de retroceso (\ ') en lugar de sus caracteres de comillas normales. '" $ {foo} "' es literalmente $ {foo} '\' $ {foo} \ '' es lo que realmente quiere – Hovis

+1

¡También hay muchos transpilers para convertir ES6 en ES5 y solucionar el problema de compatibilidad! – Omid

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, no, eso no fue posible en javascript. Usted tendría que recurrir a:

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

Pronto será posible en javascript (ES6) con la plantilla Cuerdas, véase mi respuesta detallada a continuación. – bformet

+0

[Es posible] (http://stackoverflow.com/a/28497562/1189651) si le gusta escribir CoffeeScript, que en realidad ES javascript con una mejor sintaxis. – bformet

37

Prior to Firefox 34/41 Chrome/Safari 9/Microsoft Edge, no. Aunque se puede tratar de conseguir sprintf for JavaScript a mitad de camino:

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

Gracias. Si usa dojo, sprintf está disponible como un módulo: http://bill.dojotoolkit.org/api/1.9/dojox/string/sprintf – user64141

4

Si usted está tratando de hacer interpolación para microtemplating, me gusta Mustache.js para ese propósito.

18

bien que podría hacer esto, pero no es especialmente generales

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

Desde aquí se puede escribir una función que hace esto de forma inteligente si realmente se necesita para

+1

Bueno, pero me imagino que habría un golpe de rendimiento. –

7

Si te gusta escribir CoffeeScript que podría hacer:

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

CoffeeScript actualmente ES javasc ript, pero con una sintaxis mucho mejor.

Para obtener una descripción general de CoffeeScript, consulte este beginner's guide.

3

Puede usar esta función de javascript para realizar este tipo de creación de plantillas. No es necesario incluir una biblioteca completa.

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

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

Utilizando una función como un argumento para la función String.replace() era parte de especificación de la ECMAScript v3. Ver this SO answer para más detalles.

+0

¿Es esto eficiente? – momomo

+0

La eficiencia dependerá en gran medida del navegador del usuario, ya que esta solución delega el "trabajo pesado" de emparejar la expresión regular y hacer reemplazos de cadena con las funciones nativas del navegador. En cualquier caso, dado que esto está sucediendo en el lado del navegador de todos modos, la eficiencia no es una gran preocupación. Si desea la creación de plantillas del lado del servidor (para Node.JS o similar), debe usar la solución de literales de plantillas ES6 descrita por @bformet, ya que es probable que sea más eficiente. – Eric

5

La respuesta completa, lista para ser usada:

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

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

llamada como

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

para adjuntarlo a String.prototype:

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

A continuación, utilice como:

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

escribí este paquete NPM stringinject https://www.npmjs.com/package/stringinject que le permite hacer lo siguiente

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

que sustituirá a la {0} y {1} con los elementos de matriz y regresar la siguiente cadena

"this is a test string for stringInject" 

o podría reemplazar los marcadores de posición con las teclas de objetos y valores, así:

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

"My username is tjcafferkey on Github" 
0

Bueno, podría usar this is ${variable} o puede usar "this is "+variable Ambos funcionan bien.

También recuerde usar la tilde (``) clave en torno a la this is ${variable} en lugar de "o"

+0

Esta respuesta parece un duplicado. –

Cuestiones relacionadas