template es6 ecmascript concatenate javascript string string-interpolation

es6 - ¿Cómo puedo hacer la interpolación de cadenas en JavaScript?



template string javascript html (15)

tl; dr

Utilice los literales de cadena de plantilla de ECMAScript 2015, si corresponde.

Explicación

No hay una forma directa de hacerlo, según las especificaciones de ECMAScript 5, pero ECMAScript 6 tiene developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , que también se conocían como quasi-literals durante la redacción de la especificación. Úsalos así:

> var n = 42; undefined > `foo${n}bar` ''foo42bar''

Puedes usar cualquier expresión válida de JavaScript dentro de {} . Por ejemplo:

> `foo${{name: ''Google''}.name}bar` ''fooGooglebar'' > `foo${1 + 3}bar` ''foo4bar''

La otra cosa importante es que ya no tiene que preocuparse por las cadenas de varias líneas. Puedes escribirlos simplemente como

> `foo ... bar` ''foo/n bar''

Nota: usé io.js v2.4.0 para evaluar todas las cadenas de plantillas que se muestran arriba. También puede usar el Chrome más reciente para probar los ejemplos mostrados anteriormente.

Nota: las especificaciones de ES6 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… están developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , pero aún no han sido implementadas por los principales navegadores.
De acuerdo con las páginas de la Red de desarrolladores de Mozilla , esto se implementará para soporte básico a partir de las siguientes versiones: Firefox 34, Chrome 41, Internet Explorer 12. Si eres usuario de Opera, Safari o Internet Explorer y sientes curiosidad por esto ahora , este banco de pruebas se puede usar para jugar hasta que todos reciban apoyo para esto.

Considere este código:

var age = 3; console.log("I''m " + age + " years old!");

¿Hay otras formas de insertar el valor de una variable en una cadena, aparte de la concatenación de cadenas?


Advertencia: evite cualquier sistema de plantillas que no le permita escapar de sus propios delimitadores. Por ejemplo, no habría manera de generar lo siguiente utilizando el método supplant() mencionado aquí.

"Tengo 3 años gracias a mi variable {age}".

La interpolación simple puede funcionar con pequeños scripts autocontenidos, pero a menudo viene con este defecto de diseño que limitará cualquier uso serio. Honestamente prefiero las plantillas DOM, tales como:

<div> I am <span id="age"></span> years old!</div>

Y use jQuery manipulation: $(''#age'').text(3)

Alternativamente, si simplemente estás cansado de la concatenación de cadenas, siempre hay una sintaxis alternativa:

var age = 3; var str = ["I''m only", age, "years old"].join(" ");


Ampliando la segunda respuesta de Greg Kindel , puede escribir una función para eliminar parte de la repetición:

var fmt = { join: function() { return Array.prototype.slice.call(arguments).join('' ''); }, log: function() { console.log(this.join(...arguments)); } }

Uso:

var age = 7; var years = 5; var sentence = fmt.join(''I am now'', age, ''years old!''); fmt.log(''In'', years, ''years I will be'', age + years, ''years old!'');


Aquí hay una solución que requiere que proporcione un objeto con los valores. Si no proporciona un objeto como parámetro, usará por defecto variables globales. Pero mejor atenerse a usar el parámetro, es mucho más limpio.

String.prototype.interpolate = function(props) { return this.replace(//{(/w+)/}/g, function(match, expr) { return (props || window)[expr]; }); }; // Test: // Using the parameter (advised approach) document.getElementById("resultA").innerText = "Eruption 1: {eruption1}".interpolate({ eruption1: 112 }); // Using the global scope var eruption2 = 116; document.getElementById("resultB").innerText = "Eruption 2: {eruption2}".interpolate();

<div id="resultA"></div><div id="resultB"></div>


Desde ES6, puedes usar literales de plantilla :

let age = 3; console.log(`I''m ${age} years old!`);

PD Ten en cuenta el uso de backticks: ` .



Podría usar el sistema de plantillas de Prototype si realmente tiene ganas de usar un martillo para romper una tuerca:

var template = new Template("I''m #{age} years old!"); alert(template.evaluate({age: 21}));


Prueba sprintf . Por ejemplo:

vsprintf(''The first 4 letters of the english alphabet are: %s, %s, %s and %s'', [''a'', ''b'', ''c'', ''d'']);


Pruebe kiwi , un módulo ligero de JavaScript para la interpolación de cadenas.

Tu puedes hacer

Kiwi.compose("I''m % years old!", [age]);

o

Kiwi.compose("I''m %{age} years old!", {"age" : age});


Puede hacerlo fácilmente usando template string ES6 y transpilar a ES5 usando cualquier transpilar disponible como babel.

const age = 3; console.log(`I''m ${age} years old!`);

http://www.es6fiddle.net/im3c3euc/


Si desea interpolar en la salida de console.log , simplemente

console.log("Eruption 1: %s", eruption1); ^^

Aquí, %s es lo que se llama un "especificador de formato". console.log tiene este tipo de soporte de interpolación incorporado.


Te puedo mostrar con un ejemplo:

function fullName(first, last) { let fullName = first + " " + last; return fullName; } function fullNameStringInterpolation(first, last) { let fullName = `${first} ${last}`; return fullName; } console.log(''Old School: '' + fullName(''Carlos'', ''Gutierrez'')); console.log(''New School: '' + fullNameStringInterpolation(''Carlos'', ''Gutierrez''));


Utilizo este patrón en muchos idiomas cuando todavía no sé cómo hacerlo correctamente y solo quiero tener una idea rápidamente:

// JavaScript var stringValue = ''Hello, my name is {name}. You {action} my {relation}.'' .replace(/{name}/g ,''Indigo Montoya'') .replace(/{action}/g ,''killed'') .replace(/{relation}/g,''father'') ;

Aunque no es particularmente eficiente, me parece legible. Siempre funciona, y siempre está disponible:

'' VBScript dim template = "Hello, my name is {name}. You {action} my {relation}." dim stringvalue = template stringValue = replace(stringvalue, "{name}" ,"Luke Skywalker") stringValue = replace(stringvalue, "{relation}","Father") stringValue = replace(stringvalue, "{action}" ,"are")

SIEMPRE

* COBOL INSPECT stringvalue REPLACING FIRST ''{name}'' BY ''Grendel'' INSPECT stringvalue REPLACING FIRST ''{relation}'' BY ''Mother'' INSPECT stringvalue REPLACING FIRST ''{action}'' BY ''did unspeakable things to''

ACTUALIZACIÓN : He actualizado la versión de javascript para reemplazar todas las ocurrencias en lugar de solo la primera.


use ` ( acentos graves también conocidos como comillas invertidas ) en lugar de comillas simples ( '' ) o comillas dobles ( " ) y el signo de dólar / corchete ${ variable }

Por ejemplo:

console.log( `current date: ${new Date()}` );

Lea más sobre los literales de plantilla aquí .


Remedial JavaScript de Douglas Crockford incluye una función String.prototype.supplant . Es corto, familiar y fácil de usar:

String.prototype.supplant = function (o) { return this.replace(/{([^{}]*)}/g, function (a, b) { var r = o[b]; return typeof r === ''string'' || typeof r === ''number'' ? r : a; } ); }; // Usage: alert("I''m {age} years old!".supplant({ age: 29 })); alert("The {a} says {n}, {n}, {n}!".supplant({ a: ''cow'', n: ''moo'' }));

Si no desea cambiar el prototipo de String, siempre puede adaptarlo para que sea independiente, o colocarlo en algún otro espacio de nombres, o lo que sea.