Considera este código:
var age = 3;
console.log("I'm " + age + " years old!");
¿Hay alguna otra forma de insertar el valor de una variable en una cadena, aparte de la concatenación de cadenas?
javascript
string
string-interpolation
Tom Lehman
fuente
fuente
Show GRAPH of : ${fundCode}-${funcCode}
me atrapaShow GRAPH of : AIP001-_sma
(use las líneas de retroceso alrededor de la cadena 1 ... parece que no se puede mostrar aquí)Respuestas:
Desde ES6, puede usar literales de plantilla :
PS Tenga en cuenta el uso de acentos abiertos:
``
.fuente
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 cadenas de plantilla , que también se conocían como cuasi literales durante la redacción de la especificación. Úselos así:
Puede usar cualquier expresión de JavaScript válida dentro de
{}
. Por ejemplo:La otra cosa importante es que ya no tiene que preocuparse por las cadenas de varias líneas. Puedes escribirlos simplemente como
Nota: Usé io.js v2.4.0 para evaluar todas las cadenas de plantillas que se muestran arriba. También puede usar el último Chrome para probar los ejemplos que se muestran arriba.
Nota: Las especificaciones ES6 ahora están finalizadas , pero aún no se han implementado en todos los principales navegadores.
De acuerdo con las páginas de Mozilla Developer Network , 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 tienes curiosidad sobre esto ahora , este banco de pruebas se puede usar para jugar hasta que todos obtengan apoyo para esto.
fuente
Remedial JavaScript de Douglas Crockford incluye una
String.prototype.supplant
función. Es breve, familiar y fácil de usar:Si no desea cambiar el prototipo de String, siempre puede adaptarlo para que sea independiente, o colocarlo en otro espacio de nombres, o lo que sea.
fuente
"The {0} says {1}, {1}, {1}!".supplant(['cow', 'moo'])
Advertencia: evite cualquier sistema de plantillas que no le permita escapar de sus propios delimitadores. Por ejemplo, no habría forma de generar lo siguiente utilizando el
supplant()
método mencionado aquí.La interpolación simple puede funcionar para pequeños scripts autocontenidos, pero a menudo viene con este defecto de diseño que limitará cualquier uso serio. Sinceramente, prefiero las plantillas DOM, como:
Y use la manipulación de jQuery:
$('#age').text(3)
Alternativamente, si simplemente está cansado de la concatenación de cadenas, siempre hay una sintaxis alternativa:
fuente
Array.join()
es más lenta que la+
concatenación directa ( estilo), porque los motores de navegador (que incluye V8, que incluye nodo y casi cualquier cosa que ejecute JS hoy) lo han optimizado masivamente y hay una gran diferencia a favor de la concatenación directatoken
, por lo tanto, siempre que no proporcione un objeto de datos que tenga unage
miembro, estará bien.supplant
es injustificada:"I am 3 years old thanks to my {age} variable.".supplant({}));
devuelve exactamente la cadena dada. Si seage
les diera, aún se podría imprimir{
y}
usar{{age}}
Pruebe la biblioteca sprintf (una implementación completa de JavaScript sprintf de código abierto). Por ejemplo:
vsprintf toma una matriz de argumentos y devuelve una cadena con formato.
fuente
Utilizo este patrón en muchos idiomas cuando todavía no sé cómo hacerlo correctamente y solo quiero tener una idea rápidamente:
Si bien no es particularmente eficiente, me parece legible. Siempre funciona y siempre está disponible:
SIEMPRE
fuente
Podrías usar el sistema de plantillas de Prototype si realmente quieres usar un mazo para romper una tuerca:
fuente
Puede hacerlo fácilmente usando ES6
template string
y transpilar a ES5 usando cualquier transpilar disponible como babel.http://www.es6fiddle.net/im3c3euc/
fuente
Pruebe kiwi , un módulo JavaScript ligero para la interpolación de cadenas.
Tu puedes hacer
o
fuente
Si desea interpolar en la
console.log
salida, entonces soloAquí,
%s
es lo que se llama un "especificador de formato".console.log
tiene este tipo de soporte de interpolación incorporado.fuente
Aquí hay una solución que requiere que proporciones un objeto con los valores. Si no proporciona un objeto como parámetro, utilizará variables globales de manera predeterminada. Pero es mejor seguir usando el parámetro, es mucho más limpio.
fuente
eval
,eval
es malo!eval
, pero a veces no. Por ejemplo, si el OP quería una forma de interpolar usando el alcance actual, sin tener que pasar un objeto de búsqueda (como funciona la interpolación Groovy), estoy bastante seguro deeval
que sería necesario. No recurras al viejo "eval is evil".eval
es la única forma de acceder a las variables locales en su alcance . Así que no lo rechaces solo porque lastima tus sentimientos. Por cierto, también prefiero la forma alternativa porque es más segura, pero eleval
método es el que responde con precisión la pregunta de OP, por lo tanto, está en la respuesta.eval
es que no puede acceder a los vars desde otro ámbito, por lo que si su.interpolate
llamada está dentro de otra función, y no es global, no funcionará.Ampliando la segunda respuesta de Greg Kindel , puede escribir una función para eliminar algunas de las repeticiones:
Uso:
fuente
Te puedo mostrar con un ejemplo:
fuente
Desde ES6, si desea hacer una interpolación de cadenas en claves de objeto, obtendrá un
SyntaxError: expected property name, got '${'
si hace algo como:En su lugar, debe hacer lo siguiente:
fuente
fuente
El uso de la sintaxis de la plantilla falla en los navegadores más antiguos, importante si está creando HTML para uso público. El uso de la concatenación es tedioso y difícil de leer, especialmente si tiene muchas o largas expresiones, o si debe usar paréntesis para manejar mezclas de elementos de números y cadenas (los cuales usan el operador +).
PHP expande cadenas entre comillas que contienen variables e incluso algunas expresiones usando una notación muy compacta:
$a="the color is $color";
En JavaScript, se puede escribir una función eficiente para apoyar esto:,
var a=S('the color is ',color);
usando un número variable de argumentos. Si bien no hay ninguna ventaja sobre la concatenación en este ejemplo, cuando las expresiones se alargan, esta sintaxis puede ser más clara. O se puede usar el signo de dólar para señalar el inicio de una expresión usando una función de JavaScript, como en PHP.Por otro lado, escribir una función de solución eficiente para proporcionar una expansión de cadenas similar a una plantilla para navegadores más antiguos no sería difícil. Probablemente alguien ya lo haya hecho.
Finalmente, imagino que sprintf (como en C, C ++ y PHP) podría escribirse en JavaScript, aunque sería un poco menos eficiente que estas otras soluciones.
fuente
Interpolación flexible personalizada:
fuente
Si bien las plantillas son probablemente las mejores para el caso que usted describe, si tiene o quiere sus datos y / o argumentos en forma iterativa / matriz, puede usarlos
String.raw
.Con los datos como una matriz, se puede usar el operador de propagación:
fuente
No pude encontrar lo que estaba buscando, luego lo encontré:
Si está utilizando Node.js, hay un
util
paquete integrado con una función de formato que funciona así:Casualmente, esto también está integrado en
console.log
sabores en Node.js:fuente